A palavra chave USER_NAME no SQL é usada para informar o nome do usuário (como o próprio nome diz). Veja o exemplo abaixo:

SELECT USER_NAME()

No caso acima informará o usuário que está logado na base de dados, se o usuário estiver em rede será informado o nome da rede, barra invertida e em seguida o nome do usuário. Ex.: ‘SQLCOMOUMTODO\alexandre’.

O USER_NAME pode receber um parâmetro que deve ser o ID do usuário na base de dados.

SELECT USER_NAME(1)

Na maioria dos casos, o ID 1 corresponde ao usuário ‘dbo’.

Para se obter maiores informações sobre o usuário, deve fazer o filtro na tabela de gerenciamento de usuários, a ’sysusers’. Esta tabela pode fornecer informações como: quando foi criado o usuário (createdate), quando foi atualizado o usuário (updatedate), se o usuário está logado no momento, entre outras informações.

SELECT

*

FROM

sysusers

WHERE

name = USER_NAME(1)

A instrução acima retorna a mesma informação da instrução abaixo. Apenas mudando os campos que são comparados.

SELECT

*

FROM

sysusers

WHERE

uid = 1

Já expliquei aqui no blog como selecionar uma porcentagem de registros, mas não expliquei como funciona a claúsula TOP sem o PERCENT (indicativo de porcentagem).

O TOP sem o PERCENT retorna os primeiros registros conforme o número especificado após a clausula.

SELECT TOP 50

*

FROM

Cliente

A instrução acima irá informar os primeiros 50 clientes retornados na consulta. Muitos utilizam o TOP quando necessitam retornar o maior / menor registro de uma tabela, criando uma instrução similar a esta com um TOP 1 e ordenando por decrescente / ascendente para se obter o resultado. Há uma outra forma de se obter o mesmo resultado consumindo menos recursos, basta substituir pelo MAX / MIN, mas isto ficará para um próximo artigo.

A função ISNUMERIC do SQL informa se o campo passado por parâmetro é do tipo número, retornando uma variável booleana (verdadeiro ou falso). A sintaxe é simples e não possue nenhum segredo.

SELECT

ISNUMERIC(RG) AS [Número?]

FROM

Cliente

Esta função retorna uma variável booleana, porém em binário, indicando 0 quando for falso (não é número) e 1 quando for verdadeiro (número). É uma função muito útil que elimina a possibilidade de criar uma função no retorno do SQL.

Toda linguagem de programação possue operadores lógicos, que são elementos pré-definidos. Vou explicar neste artigo como utilizar os principais operados lógicos existentes: AND, OR e NOT.

Os operadores AND e OR são operadores que necessitam de dois elementos para concluir a instrução, já o NOT é do tipo unário, precisando de apenas um elemento.

O operador AND é utilizado sempre quando necessita de que todas (duas ou mais) as condições estabelecidas sejam verdadeiras. Vejamos um exemplo que informa veículos:

SELECT

Fabricante,

Nome,

Modelo,

Ano,

Cilindrada

FROM

Veiculos

WHERE

Fabricante = ‘Chevrolet’

AND

Modelo = 2006

AND

Ano = 2005

Notem que a instrução acima utiliza dois operadores AND, isto faz com que a instrução inteira seja verdadeira, ou não retornará o registro.

Já o operador lógico OR é utilizado quando pelo menos uma das condições estabelecidas forem satisfeitas.

SELECT

Fabricante,

Nome,

Modelo,

Ano,

Cilindrada

FROM

Veiculos

WHERE

Fabricante = ‘Fiat’

OR

Ano = 2005

No caso acima, será retornado os veículos (Veiculos) que foram fabricados no ano de 2005 ou que o fabricante seja ‘Fiat’.

E o por último, o operador NOT, que faz a oposição da condição.

SELECT

Fabricante,

Nome,

Modelo,

Ano,

Cilindrada

FROM

Veiculos

WHERE

NOT

Ano = 2004

Esta instrução exibirá todos os registros que NÃO foram fabricados em 2004.

O SQL possui um comando que retorna o nome do servidor, isto parece até o momento de pouca utilidade a menos que uma organização troque de servidor com muita frequência, veja a sintaxe para descobrir o nome do servidor:

SELECT @@SERVERNAME AS ‘Nome do Servidor’

O retorno no meu caso seria ‘SQLCOMOUMTODO’.

Neste post irei explicar como se utiliza a instrução WHILE em SQL com BREAK e CONTINUE. O WHILE é utilizado para fazer uma repetição condicional, permitindo executar ações várias vezes enquanto a condição estabelecida estiver de  acordo.

DECLARE @i INT

SET @i = 1

WHILE (@i <= 10)

BEGIN

PRINT @i

SET @i = @i + 1

END

Acima é feito uma instrução WHILE comum, lembrando que DEVE ter algo que alimente a condição, caso não seja feito irá ocorrer um looping infinito e podendo travar o servidor. Mas o objetivo do post de hoje não é este e sim demonstrar a instrução WHILE com CONTINUE e BREAK.

DECLARE @i INT

SET @i = 1

WHILE (@i <= 10)

BEGIN

PRINT @i

SET @i = @i + 1

IF @i = 6

BREAK

END

A instrução acima interrompe a repetição condicional quando atingir a metade, ou melhor, quando a variável ‘@i’ tiver o valor 6.

DECLARE @i INT

SET @i = 1

WHILE (@i <= 10)

BEGIN

PRINT @i

SET @i = @i + 1

CONTINUE

IF @i = 6

BREAK

END

Com o CONTINUE acima da verificação do valor de ‘@i’, a repetição ignora todo o resto da instrução que ESTIVER ENTRE o WHILE, não executando (no nosso caso) a verificação do valor de ‘@i’.

Alterando registros em SQL

Outubro 25, 2007

Vou iniciar este post escrevendo sobre como alterar registros em tabelas utilizando SQL. A sintaxe é simples:

UPDATE

[NOME_TABELA]

SET

[NOME_CAMPO] = [EXPRESSÃO][...n]

WHERE
{

[CONDICAO_SQL]

}

Como podem ver, inicia-se com a palavra-chave UPDATE, em seguida insere o nome da tabela desejada para ser alterada, logo após a palavra chave SET e o nome do(s) campo(s) à ser(em) alterado(s) e uma possível condição, caso necessite atualizar registros específicos.

UPDATE

Livros

SET

Nome = ‘The Art of War’

WHERE

LivroID = 5

Pode-se utilizar a instrução UPDATE unindo informações de diversas tabelas, caso precise comparar um valor que a tabela que deseja alterar não possua.

UPDATE

Livros

SET

L.Nome = ‘The Art of War’

FROM

Livros L,

Autores A

WHERE

L.AutorID = A.AutorID

AND

A.Nascimento BETWEEN ‘1950-01-01 00:00:00.000′ AND ‘1970-01-01 23:59:59.999′

A instrução SQL acima irá alterar todos os registros do campo ‘Nome’ da tabela ‘Livros’ cujo o autor coincidir com o do livro e a data de nascimento (Nascimento) do autor estiver entre 1950 e 1970.

Também pode utilizar funções no campo que deseja alterar.

UPDATE

Livros

SET

Valor = CAST(RAND() * 150 AS MONEY)

WHERE

ID > 10

Acima será alterados todos os livros que o ‘ID’ (chave primária) for maior que 10. A função RAND retorna um número aleatório entre 0 e o número especificado (no nosso caso 100) e após isso é feito uma conversão para o tipo MONEY, que indica que é moeda.

Existe outra maneira de atualizar um registro de uma tabela unindo informações de uma outra tabela. Isto pode ser feito utilizando o operador JOIN, que serve para juntar informações de tabelas que possuem registros diferentes, porém que tenham campo(s) relacionados entre si.

UPDATE

Livros

SET

Livros.Publicacao = Autores.Nascimento

FROM

Livros

INNER JOIN

Autores ON

(Autores.AutorID = Livros.AutorID)

E por último, pode alterar diversos campos de uma só vez utilizando o UPDATE.

UPDATE

Livros

SET

Nome = ‘O Alquimista’,

Publicacao = ‘1988-01-01′,

AutorID = 75

WHERE

LivroID = 23

Está ai a atualização de 3 campos de uma só vez…

Unir duas tabelas em SQL

Outubro 24, 2007

O operador UNION permite a combinação de mais de dois resultados de uma instrução SQL em um único resultado de consulta. Os resultados combinados no operador UNION devem ter a mesma estrutura, ou seja, a mesma quantidade e tipos de campos devem coincidir em todas as consultas.

Segue abaixo a sintaxe da utilização do operador UNION:

INSTRUCAO_SELECT

UNION [ALL]

INSTRUCAO_SELECT

Para demonstrar como se utiliza o operador UNION, segue abaixo uma instrução de criação de uma tabela de clientes referente à pessoas físicas (ClienteFisico) e outra contendo as informações de clientes referente à pessoas jurídicas, com campos diferentes é claro (se não, não haveria a necessidade de criação de uma segunda tabela de diferenciação).

CREATE TABLE dbo.ClienteFisico
(

ID bigint NOT NULL,

Nome varchar(64) NOT NULL,

RG varchar(16) NOT NULL,

Nascimento datetime NOT NULL

) ON [PRIMARY]

CREATE TABLE dbo.ClienteJuridico
(

ID bigint NOT NULL,

NomeFantasia varchar(64) NOT NULL,

CNPJ bigint NOT NULL,

IE varchar(16) NOT NULL

) ON [PRIMARY]

Após a criação das tabelas acima pode-se unir ambas em um único resultado de consulta.

SELECT

ID,

Nome

FROM

ClienteFisico

UNION

SELECT

ID,

NomeFantasia

FROM

ClienteJuridico

A consulta acima irá retornar todos os clientes físicos e jurídicos existentes nas respectivas tabelas (ClienteFisico e ClienteJuridico)

SELECT

ID,

Nome,

RG

FROM

ClienteFisico

UNION

SELECT

ID,

NomeFantasia,

CNPJ

FROM

ClienteJuridico

Esta consulta não irá funcionar, ocorrerá um erro, porque os tipos não correspondem. O campo RG é do tipo VARCHAR que contém até 16 caracteres enquanto o campo CNPJ é do tipo CHAR que contém 14 caracteres. Este problema é fácil de ser resolvido, basta converter o resultado de um dos campos para que os dois tenham o mesmo tipo.

SELECT

ID,

Nome,

RG

FROM

ClienteFisico

UNION

SELECT

ID,

NomeFantasia,

CONVERT(VARCHAR(16), CNPJ) AS CNPJ

FROM

ClienteJuridico

Acima é demonstrado a conversão feita no campo CNPJ atribuindo um alias (codinome) ao campo, caso não seja feito, irá mostrar o campo sem nome no título do resultado.

Existe um operador que pode ser utilizado com o UNION, o ALL. A consulta com o operador ALL indica que NÃO será eliminado nenhuma duplicidade que ocorrer entre as tabelas, ou seja, mostrará tudo que existir nas tabelas que estão sendo unidas com resultado. Se omitir o ALL, como padrão, o SQL remove linhas dos resultados que duplicaram.

SELECT

ID,

Nome

FROM

ClienteFisico

UNION ALL

SELECT

ID,

NomeFantasia

FROM

ClienteJuridico

É claro que não irá servir para muita coisa o operador ALL na consulta acima, porque não existe nenhum cliente físico que possua o mesmo nome de um cliente jurídico (pelo menos que eu conheça).

Formatando datas em SQL

Outubro 19, 2007

Geralmente é preciso formatar a data que é retornada em uma instrução SQL, de uma maneira que poderia gerar uma lógica um pouco complicada e complexa. Com este intuito, a linguagem SQL possui uma função (e muitas outras) de formatação de datas.

Uma consulta que achei muito útil é a de poder capturar o dia do ano. Veja a instrução a seguir:

SELECT

DATEPART(dy, GETDATE()) AS ‘Dia do Ano’

Existe outro tipo de formatação que retorna o quadrimestre da data que for passada como parâmetro, observe:

SELECT

DATEPART(qq, ‘2007-10-19′) AS ‘Quadrimestre do Ano’

Passando esta data como parâmetro irá mostrar 4.

SELECT

DATEPART(dw, GETDATE()) AS ‘Dia da Seman’

O exemplo acima irá retornar o dia da semana correspondente de uma determinada data.

Possuem outros tipos de formatação e que podem ser úteis algum dia.

Criando TRIGGER em SQL

Outubro 17, 2007

Apesar de TRIGGERS SQL serem muito úteis, não é aconselhável a utilização deste tipo de instrução, pelo fato de prejudicar a performance. Mesmo assim irei demonstrar como criar TRIGGERS.

TRIGGER é um tipo de PROCEDURE que é executada automaticamente após uma ação especifica que ocorre em uma tabela ou view (por isso prejudica a performance).

Segue abaixo a sintaxe para criação:

CREATE TRIGGER

nome_da_trigger

ON { TABLE | VIEW }

{

{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } }

}

nome_da_trigger: Nome que deseja rotular a TRIGGER;
TABLE | VIEW: Pode-se criar uma TRIGGER apartir de uma Table ou de uma View;
AFTER: Indica que a TRIGGER apenas será acionada após todas as ações terem finalizadas com sucesso. AFTER é padrão caso a instrução FOR for a única palavra-chave especificada na criação da TRIGGER;
INSTEAD OF: Indica que a TRIGGER será executada em vez de ser executada a ação. É possível utilizar a instrução INSTEAD OF com INSERT, UPDATE e/ou DELETE;

Exemplo:

CREATE TRIGGER

tg_Cliente_Excluir

ON

Cliente

INSTEAD OF DELETE

AS

DELETE FROM Cliente WHERE ClienteID IN (SELECT ClienteID FROM deleted)
DELETE FROM ClienteTelefone WHERE ClienteID IN (SELECT ClienteID FROM deleted)

O exemplo acima irá remover todos os telefone(s) do(s) cliente(s) da tabela ‘ClienteTelefone’ antes de remover todos os clientes (Cliente) e esta TRIGGER está sendo aplicada a tabela ‘Cliente’. Repare que está sendo utilizado a instrução INSTEAD OF que em vez excluir (DELETE) o registro pela ação irá excluir ao final da TRIGGER.

CREATE TRIGGER

tg_Cliente_Cadastrar

ON

Cliente

AFTER INSERT

AS

INSERT INTO

ClienteLog

SELECT

ClienteID,

GETDATE(),

‘INSERT’

FROM

Cliente

O exemplo acima irá inserir no log da tabela ‘Cliente’ (ClienteLog) todos os IDs depois de ocorrer a execução do INSERT na tabela ‘Cliente’.

Caso precise alterar a TRIGGER, basta substituir a palavra CREATE por ALTER e adicionar a nova consulta.

Existem diversos parâmetros que pode ser passados para uma TRIGGER, mas não vou me aprofundar muito.

Fonte: MSDN Microsoft