Identificando usuários em SQL
Outubro 31, 2007
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
Utilizando a claúsula TOP em SQL
Outubro 30, 2007
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.
Descobrindo se o campo é um número em SQL
Outubro 29, 2007
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.
Usando operadores lógicos em SQL
Outubro 29, 2007
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.
Descobrindo o nome do servidor em SQL
Outubro 26, 2007
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’.
Usando WHILE com CONTINUE e BREAK
Outubro 26, 2007
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
