Você está na página 1de 47

Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/


2008
1

DICAS DE SQL SERVER







Links por comandos:


ALTER BREAK CHARINDEX
CONSULTASRAPIDAS CONTINUE CPU_ BUSY
DATALENGTH DATEPART DECLARE DENY
FUNES GETDATE ISNUMERIC
MAXCONNECTIONS OBJECTPROPERTY
OPERADORESLOGICOS PROCEDURE
REMOTO REPLICATE REVERSE
SERVERNAME SUM TOP TOPPERCENT
TRIGGERS UNION UPDATE UPDATEREG
USERNAME WHILE XML


Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
2
Usando REPLICATE em SQL

Irei demonstrar como se utiliza a instruo REPLICATE no SQL. Como o prprio
nome diz uma replicao de algo, ou seja, copia o contedo de um determinado campo
para outro. O propsito desta instruo permitir que no haja a necessidade do
desenvolvedor fazer outro filtro de um mesmo campo em uma consulta, consumindo
recursos adicionais de hardware.
SELECT
REPLICATE(Nome, 2)
FROM
Cliente
ORDER BY
Nome
A instruo acima ir retornar todos os nomes dos clientes existentes na tabela Cliente
e duplic-los no mesmo campo.
Vocs devem estar pensando, qual a finalidade disto? realmente no achei muito til
at observar um exemplo. Observe a seguinte situao, tem um cliente que possui um
telefone com um determinado nmero e um fax (eu sei, quase ningum utiliza mais
isso) com o mesmo nmero do telefone, pronto, replicado a informao do telefone
para o fax.
SELECT
Nome,
Telefone AS Telefone,
REPLICATE(Telefone, 1) AS Fax
FROM
Cliente
ORDER BY
Nome
Como podem ver a instruo acima copia o contedo do Telefone e atribui ao Fax.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
3

Como saber se o registro foi atualizado em SQL

Encontrei uma maneira muito til de saber se uma determinada instruo SQL de
alterao (UPDATE) atualizou o registro de uma tabela.
Observe a instruo abaixo de atualizao:
UPDATE
Cliente
SET
Nome = Alexandre
WHERE
ID = 89712
A instruo acima simples, porm se est instruo for feita em uma PROCEDURE
SQL ou qualquer outro tipo de execuo, como por exemplo: TRIGGER, no se saber
se o registro foi atualizado com sucesso. Para se obter esta informao preciso
adicionar a seqncia abaixo:
IF @@ROWCOUNT = 0
A pequena instruo acima verifica se a quantidade de linhas (registros) alterados
igual 0. Com isto possvel saber se o registro foi atualizado e fazer um tratamento
especfico para a situao.

Selecionando uma porcentagem de registros em SQL
At o momento nem sabia que existia uma instruo como essa no SQL. Esta instruo
consiste em informar uma porcentagem determinada de registros existentes.
SELECT TOP 50 PERCENT
ID,
Nome
FROM
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
4
Produto
A consulta acima informar os primeiros 50% retornados na consulta, lembrando que,
como no h ordenao de nenhum campo a ordem de retorno baseada no retorno do
servidor. Muitas vezes a consulta retorna a ordem de cadastro do registro, porm isto
PODE SER (no uma regra) alterado no momento em que a tabela possui muitos
registros, experimente filtrar uma tabela que tenha milhares de registros e ver que a
ordem de retorno nem sempre ser baseada na da insero.

Como descobrir a quantidade mxima de conexes
simultneas no SQL

Atualmente tenho pesquisado em como descobrir a quantidade de conexes simultneas
permitidas pelo servidor que est localizado o MS SQL Server.
A sintaxe abaixo muito simples e retorna quantidade de conexes simultneas
permitidas (a quantidade retornada no necessariamente corresponde a quantidade de
acessos atuais).
SELECT @@MAX_CONNECTIONS
Quando fiz o teste o resultado foi 32767, andei pesquisando sobre isto e acho que deve
ser a configurao padro do SQL Server.

Utilizando funes em SQL (parte 1)

A linguagem SQL uma linguagem de banco de dados que disponibiliza muitos
facilidades ao desenvolvedor, oferecendo algumas funes bsicas, so elas:
Funes Descrio
AVG
Calcula a mdia dos registros do campo
informado.
SUM
Calcula a somatria dos registros do campo
informado.
COUNT Faz a contagem de registros.
MAX Retorna o maior valor do campo especificado.
MIN Retorna o menor valor do campo especificado.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
5
muito simples a utilizao destas funes, basta aplicar o campo desejado entre
parnteses na funo, veja o exemplo abaixo:
SELECT
SUM(Valor)
FROM
Produto
Esta instruo ir retornar a somatria dos valores de todos os produtos existentes na
tabela Produto. Pode atribuir uma condio, como por exemplo, somar todos os que o
valor seja maior que R$ 50,00, isso depende da necessidade.
A instruo a seguir informa a mdia da primeira nota do primeiro bimestre de todos os
alunos (Aluno) cujo estejam entre a 6 e a 8 srie.
SELECT
AVG(Nota1)
FROM
Aluno
WHERE
Serie BETWEEN 6 AND 8
Ai vai mais alguns exemplos das outras funes:
SELECT COUNT(*) FROM Fornecedor
SELECT MAX(Salario) FROM Funcionario
SELECT MIN(Salario) FROM Funcionario

Utilizando tabelas temporrias

Vou lhes ensinar agora como utilizar tabelas temporrias em SQL. Eu conheo duas
formas de utilizao, sendo que uma requer menos recursos de hardware e o processo
mais rpido (de fato, bem mais rpido).
Segue abaixo o primeiro exemplo:
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
6
DECLARE @ID INT
DECLARE @TabelaTemporariaProduto TABLE (
ID INT
)
INSERT INTO
@TabelaTemporariaProduto
SELECT
ProdutoID
FROM
Produto
WHILE (SELECT COUNT(ID) FROM @TabelaTemporariaProduto) > 1
BEGIN
SELECT TOP 1 @ID = ID FROM @TabelaTemporariaProduto
PRINT @ID
DELETE FROM @TabelaTemporariaProduto WHERE ID = @ID
END
Vamos a explicao: as primeiras linhas correspondem a declarao de variveis, uma
do tipo INTEIRO e outra do tipo TABLE, que um objeto que contm variados tipos
de variveis, no entendeu? Vou explicar melhor. Imagine um carro (Objeto) e suas
caracteristicas so os tipos de variveis, como: cor, cilindrada, portas, combustvel, etc.
Aps isso h uma instruo INSERT, que insere os registros na tabela temporria os
IDs dos produtos da tabela Produto. Em seguida, possui uma repetio com uma
instruo COUNT que faz a contagem de quantos registros existem na tabela
temporria (@TabelaTemporariaProduto) e verifica se a contagem maior que 1.
Atribui o ID do produto varivel @ID e em seguida faz a impresso do valor, aps
isso exclui aquele registro da tabela temporria, se isso no ocorrer, o processo entra em
looping infinito.
A prxima sequncia de instruo SQL bem mais rpida do que a anterior e utiliza
outro tipo de repetio:
DECLARE @ID INT
DECLARE @TabelaTemporariaProduto TABLE (
ID INT
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
7
)
INSERT INTO
@TabelaTemporariaProduto
SELECT
ProdutoID
FROM
Produto
DECLARE TempCursor CURSOR
FOR
SELECT
ID
FROM
@TabelaTemporariaProduto
OPEN TempCursor
FETCH NEXT FROM
TempCursor
INTO
@ID
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @IDFETCH NEXT FROM
TempCursor
INTO
@ID
END
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
8
CLOSE TempCursor
DEALLOCATE TempCursor
As primeiras linhas correspondem a declarao das variveis, faz a insero dos
registros na tabela temporria, declara o CURSOR e informa os campos que ir
participar da repetio. Faz a abertura do CURSOR e atribui varivel (ID) o primeiro
(e nico) campo listado na consulta do CURSOR. A instruo @@FETCH_STATUS
corresponde ao sucesso da operao (1 - Ok, -1 - Falhou e -2 - Linha perdida), faz a
impresso do @ID e em seguida move o CURSOR.
Espero que tenham entendido o funcionamento das duas tcnicas.

Criando procedures SQL

Uma maneira muito til de fazer uma consulta em uma tabela a utilizao
de PROCEDURES SQL. A criao e utilizao desta instruo simples, veja abaixo
a sintaxe:
CREATE PROC[EDURE] nome_procedure
[
@parametro tipo_parametro [=valor_padrao]
]
AS
instrucao_SQL [...n]
Irei criar uma PROCEDURE que consulta todos os produtos da tabela Produto
ordenando pelo o valor do produto (Valor) em ordem decrescente.
CREATE PROCEDURE sp_produto_informar
AS
SELECT
Nome,
Descricao,
Valor
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
9
FROM
Produto
ORDER BY
Valor
DESC
A instruo ORDER BY ordena um determinado campo, porm prejudica fortemente a
performance do servidor, portanto evite usar esta instruo (que muitas vezes
indispensvel).
Agora adicionarei um parmetro a consulta que ser comparado no campo Nome e o
resultado tambm ser ordenado pelo Valor de forma decrescente.
CREATE PROCEDURE sp_produto_informar
@Nome VARCHAR(64)
AS
SELECT
Nome,
Descricao,
Valor
FROM
Produto
WHERE
Nome LIKE % + @Nome + %
ORDER BY
Valor
DESC
Para executar esta PROCEDURE basta abrir MS SQL Server e executar o seguinte
cdigo:
EXECUTE sp_produto_informar Refri
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
10
ou
EXEC sp_produto_informar Refri
Esta consulta retornar todos os produtos cujo o nome comece com Refri e orden-los
novamente pelo valor decrescente. Lembrando que SQL no case-sensitive.
A partir desta sintaxe pode-se passar quantos parmetros for necessrio para fazer uma
consulta mais precisa e se obter o resultado exato que se deseja. Muitos programadores
utilizam a identificao daquele registro na tabela, que deve ser nica, uma chave
primria.
Uma PROCEDURE pode tambm fazer qualquer outra operao na base, como por
exemplo: inserir, alterar e deletar algum registro. A instruo abaixo permite inserir
algum registro na tabela atravs de uma PROCEDURE, passando os parmetros
necessrios.
CREATE PROCEDURE sp_produto_inserir
@Nome VARCHAR(64),
@Descricao TEXT,
@Valor MONEY
AS
INSERT INTO
Produto(Nome, Descricao, Valor)
VALUES(
@Nome,
@Descricao,
@Valor
)
Os campos da tabela podem ser omitidos, contanto que os valores estejam na ordem dos
campos.
Abaixo segue um exemplo de uma PROCEDURE que faz a alterao de alguns
campos (Nome, Descricao e Valor):
CREATE PROCEDURE sp_produto_alterar
@ID BIGINT,
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
11
@Nome VARCHAR(64),
@Descricao TEXT,
@Valor MONEY
AS
UPDATE
Produto
SET
Nome = @Nome,
Descricao = @Descricao,
Valor = @Valor
WHERE
ID = @ID
Como havia dito, a varivel @ID deve conter o chave primria para que a alterao seja
nica e eficiente.

Como criar consultas SQL mais rpidas

Estou abordando este assunto aqui, pelo fato de ser um assunto muito importante
atualmente para organizaes que possuem uma grande quantidade de dados e muitos
acessos simultaneamente.
Uma consulta mal projetada pode acarretar em lentido ao servidor ou at mesmo fazer
com que o servidor permanea fora do ar por um perodo, impossibilitando o usurio de
utilizar algum servio do sistema ou site, gerando prejuzo a organizao.
Otimizar uma consulta SQL nem sempre uma tarefa fcil e simples, precisa um pouco
de conhecimento para desenvolver filtros que obtenham resultados que no custe ao
servidor muitos recursos de hardware. Muitos dos exemplos que irei demonstrar foram
resultados de pesquisas e testes executados no prprio Query Analyser do MS SQL
Server 2000.
Uma forma de prejudicar bastante o desempenho ao acessar a base de dados, a criao
de TRIGGERS. Esta instruo acionada sempre que uma determinada tabela sofre
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
12
alguma alterao (INSERT, UPDATE, DELETE). Portanto, ao invs de criar uma
TRIGGER prefira criar uma PROCEDURE que ser acionada sempre que uma
tarefa for feita.
Ao criar um simples filtro em uma tabela, pode-se encontrar alguns pontos que
prejudicam a performance da consulta. A consulta abaixo demonstra um dos exemplos:
SELECT
*
FROM
Cliente
Ao fazer algum filtro em uma tabela, evite informar todos os campos de uma tabela em
uma consulta, a menos que isso for realmente necessrio. Muitas das vezes no ser
utilizado todos os campos. A consulta acima pode ser executada rapidamente se a tabela
da base de dados contiver poucos registros, mas para adquirir uma melhor performance
da consulta recomendvel filtrar apenas os campos que sero utilizados, o exemplo
abaixo demonstra um cenrio parecido:
SELECT
Nome,
CPF,
RG,
Endereco
FROM
Cliente
Outro ponto importante a utilizao da instruo COUNT, esta instruo informa a
quantidade de registros retornados em uma consulta.
SELECT
COUNT(*)
FROM
Cliente
Porm no h a necessidade de utilizao desta consulta, porque ao execut-la, ser
contado um registro de cada vez. Para isto existe as tabelas sysobjects e sysindexes.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
13
Com estas duas tabelas possvel obter muitas informaes de diversos todos objetos
existentes na base de dados.
SELECT
sysobjects.name AS [Nome da Tabela],
sysindexes.rowcnt AS [Qtde. de Registros]
FROM
sysobjects
INNER JOIN
sysindexes ON
sysindexes.id = sysobjects.id
WHERE
sysobjects.name = Cliente
AND
sysindexes.indid = 1
A consulta acima informa a quantidade de registros existentes na tabela Cliente.
Reparem que foi utilizado uma nova instruo, o INNER JOIN. Esta instruo serve
para fazer a juno de duas ou mais tabelas, lembrando que isto significa que DEVE
possuir algum registro na tabela secundria, ou seja na tabela que est recebendo o
INNER JOIN, sendo assim, necessrio fazer a comparao de campos em comum
que as duas possuem. Certifique-se que o nome da tabela escrito na clusula WHERE
est correto, caso contrrio no ser retornado nenhum registro. Esta consulta outro
exemplo que poder trazer problemas de performance, porque ao utiliz-la, a consulta
toda pode acessar qualquer uma das informaes (campos) existentes nas tabelas. Uma
outra forma de consultar a quantidade de registros de uma tabela a seguinte:
SELECT
sysindexes.rowcnt AS [Qtde. de Registros]
FROM
sysindexes
WHERE
sysindexes.indid = 1
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
14
AND
EXISTS(
SELECT
sysobjects.id
FROM
sysobjects
WHERE
sysobjects.id = sysindexes.id
AND
sysobjects.name = Cliente
)
Ao fazer um filtro como o acima, pode-se obter resultados muito eficazes em relao ao
desempenho. A instruo EXISTS uma instruo extremamente rpida porque utiliza
pouco recurso de hardware. como se retornasse uma varivel booleana.
Outra instruo que consome um maior processamento a instruo IN, que utilizada
quando necessrio fazer o filtro de um vetor de dados. O exemplo abaixo informa os
todos clientes que possuir algum telefone.
SELECT
Nome
FROM
Cliente
WHERE
ID IN(SELECT ClienteID FROM Telefone)
Outra maneira de informar estes registro seria utilizar (novamente) a instruo EXISTS
ao invs da instruo IN.
SELECT
Cliente.Nome
FROM
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
15
Cliente
WHERE
EXISTS(
SELECT
Telefone.ClienteID
FROM
Telefone
WHERE
Telefone.ClienteID = Cliente.ID
)
So inmeras as tarefas que se pode fazer para melhorar a performance de uma
consulta. Estas so apenas algumas operaes que devem ser feitas caso necessita de
resultados mais rpidos em consultas SQL.

Descobrindo se o campo um nmero em SQL

A funo ISNUMERIC do SQL informa se o campo passado por parmetro do tipo
nmero, retornando uma varivel booleana (verdadeiro ou falso). A sintaxe simples e
no possue nenhum segredo.
SELECT
ISNUMERIC(RG) AS [Nmero?]
FROM
Cliente
Esta funo retorna uma varivel booleana, porm em binrio, indicando 0 quando for
falso (no nmero) e 1 quando for verdadeiro (nmero). uma funo muito til que
elimina a possibilidade de criar uma funo no retorno do SQL.

Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
16
Usando operadores lgicos em SQL

Toda linguagem de programao possue operadores lgicos, que so elementos pr-
definidos. Vou explicar neste artigo como utilizar os principais operados lgicos
existentes: AND, OR e NOT.
Os operadores AND e OR so operadores que necessitam de dois elementos para
concluir a instruo, j o NOT do tipo unrio, precisando de apenas um elemento.
O operador AND utilizado sempre quando necessita de que todas (duas ou mais) as
condies estabelecidas sejam verdadeiras. Vejamos um exemplo que informa veculos:
SELECT
Fabricante,
Nome,
Modelo,
Ano,
Cilindrada
FROM
Veiculos
WHERE
Fabricante = Chevrolet
AND
Modelo = 2006
AND
Ano = 2005
Notem que a instruo acima utiliza dois operadores AND, isto faz com que a instruo
inteira seja verdadeira, ou no retornar o registro.
J o operador lgico OR utilizado quando pelo menos uma das condies
estabelecidas forem satisfeitas.
SELECT
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
17
Fabricante,
Nome,
Modelo,
Ano,
Cilindrada
FROM
Veiculos
WHERE
Fabricante = Fiat
OR
Ano = 2005
No caso acima, ser retornado os veculos (Veiculos) que foram fabricados no ano de
2005 ou que o fabricante seja Fiat.
E o por ltimo, o operador NOT, que faz a oposio da condio.
SELECT
Fabricante,
Nome,
Modelo,
Ano,
Cilindrada
FROM
Veiculos
WHERE
NOT
Ano = 2004
Esta instruo exibir todos os registros que NO foram fabricados em 2004.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
18

Descobrindo o nome do servidor em SQL

O SQL possui um comando que retorna o nome do servidor, isto parece at o momento
de pouca utilidade a menos que uma organizao troque de servidor com muita
frequncia, 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

Neste post irei explicar como se utiliza a instruo WHILE em SQL com BREAK e
CONTINUE. O WHILE utilizado para fazer uma repetio condicional, permitindo
executar aes vrias vezes enquanto a condio estabelecida estiver de acordo.
DECLARE @i INT
SET @i = 1
WHILE (@i <= 10)
BEGIN
PRINT @i
SET @i = @i + 1
END
Acima feito uma instruo WHILE comum, lembrando que DEVE ter algo que
alimente a condio, caso no seja feito ir ocorrer um looping infinito e podendo travar
o servidor. Mas o objetivo do post de hoje no este e sim demonstrar a instruo
WHILE com CONTINUE e BREAK.
DECLARE @i INT
SET @i = 1
WHILE (@i <= 10)
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
19
BEGIN
PRINT @i
SET @i = @i + 1
IF @i = 6
BREAK
END
A instruo acima interrompe a repetio condicional quando atingir a metade, ou
melhor, quando a varivel @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 verificao do valor de @i, a repetio ignora todo o
resto da instruo que ESTIVER ENTRE o WHILE, no executando (no nosso caso)
a verificao do valor de @i.

Alterando registros em SQL

Vou iniciar este post escrevendo sobre como alterar registros em tabelas utilizando
SQL. A sintaxe simples:
UPDATE
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
20
[NOME_TABELA]
SET
[NOME_CAMPO] = [EXPRESSO][...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 aps a palavra chave SET e o nome do(s)
campo(s) ser(em) alterado(s) e uma possvel condio, caso necessite atualizar
registros especficos.
UPDATE
Livros
SET
Nome = The Art of War
WHERE
LivroID = 5
Pode-se utilizar a instruo UPDATE unindo informaes de diversas tabelas, caso
precise comparar um valor que a tabela que deseja alterar no possua.
UPDATE
Livros
SET
L.Nome = The Art of War
FROM
Livros L,
Autores A
WHERE
L.AutorID = A.AutorID
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
21
AND
A.Nascimento BETWEEN 1950-01-01 00:00:00.000 AND 1970-01-01 23:59:59.999
A instruo 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.
Tambm pode utilizar funes 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 primria) for maior que 10. A
funo RAND retorna um nmero aleatrio entre 0 e o nmero especificado (no nosso
caso 100) e aps isso feito uma converso para o tipo MONEY, que indica que
moeda.
Existe outra maneira de atualizar um registro de uma tabela unindo informaes de uma
outra tabela. Isto pode ser feito utilizando o operador JOIN, que serve para juntar
informaes de tabelas que possuem registros diferentes, porm que tenham campo(s)
relacionados entre si.
UPDATE
Livros
SET
Livros.Publicacao = Autores.Nascimento
FROM
Livros
INNER JOIN
Autores ON
(Autores.AutorID = Livros.AutorID)
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
22
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 atualizao de 3 campos de uma s vez

Unir duas tabelas em SQL

O operador UNION permite a combinao de mais de dois resultados de uma instruo
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 utilizao do operador UNION:
INSTRUCAO_SELECT
UNION [ALL]
INSTRUCAO_SELECT
Para demonstrar como se utiliza o operador UNION, segue abaixo uma instruo de
criao de uma tabela de clientes referente pessoas fsicas (ClienteFisico) e outra
contendo as informaes de clientes referente pessoas jurdicas, com campos
diferentes claro (se no, no haveria a necessidade de criao de uma segunda tabela
de diferenciao).
CREATE TABLE dbo.ClienteFisico
(
ID bigint NOT NULL,
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
23
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]
Aps a criao 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 fsicos e jurdicos existentes nas
respectivas tabelas (ClienteFisico e ClienteJuridico)
SELECT
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
24
ID,
Nome,
RG
FROM
ClienteFisico
UNION
SELECT
ID,
NomeFantasia,
CNPJ
FROM
ClienteJuridico
Esta consulta no ir funcionar, ocorrer um erro, porque os tipos no correspondem. O
campo RG do tipo VARCHAR que contm at 16 caracteres enquanto o campo CNPJ
do tipo CHAR que contm 14 caracteres. Este problema fcil 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
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
25
FROM
ClienteJuridico
Acima demonstrado a converso feita no campo CNPJ atribuindo um alias (codinome)
ao campo, caso no seja feito, ir mostrar o campo sem nome no ttulo do resultado.
Existe um operador que pode ser utilizado com o UNION, o ALL. A consulta com o
operador ALL indica que NO ser eliminado nenhuma duplicidade que ocorrer entre
as tabelas, ou seja, mostrar tudo que existir nas tabelas que esto sendo unidas com
resultado. Se omitir o ALL, como padro, o SQL remove linhas dos resultados que
duplicaram.
SELECT
ID,
Nome
FROM
ClienteFisico
UNION ALL
SELECT
ID,
NomeFantasia
FROM
ClienteJuridico
claro que no ir servir para muita coisa o operador ALL na consulta acima, porque
no existe nenhum cliente fsico que possua o mesmo nome de um cliente jurdico (pelo
menos que eu conhea).

Formatando datas em SQL

Geralmente preciso formatar a data que retornada em uma instruo SQL, de uma
maneira que poderia gerar uma lgica um pouco complicada e complexa. Com este
intuito, a linguagem SQL possui uma funo (e muitas outras) de formatao de datas.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
26
Uma consulta que achei muito til a de poder capturar o dia do ano. Veja a instruo a
seguir:
SELECT
DATEPART(dy, GETDATE()) AS Dia do Ano
Existe outro tipo de formatao que retorna o quadrimestre da data que for passada
como parmetro, observe:
SELECT
DATEPART(qq, 2007-10-19) AS Quadrimestre do Ano
Passando esta data como parmetro 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.

Criando TRIGGER em SQL

Apesar de TRIGGERS SQL serem muito teis, no aconselhvel a utilizao deste
tipo de instruo, pelo fato de prejudicar a performance. Mesmo assim irei demonstrar
como criar TRIGGERS.
TRIGGER um tipo de PROCEDURE que executada automaticamente aps uma
ao especifica que ocorre em uma tabela ou view (por isso prejudica a performance).
Segue abaixo a sintaxe para criao:
CREATE TRIGGER
nome_da_trigger
ON { TABLE | VIEW }
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } }
}
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
27
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 aps todas as aes terem
finalizadas com sucesso. AFTER padro caso a instruo FOR for a nica palavra-
chave especificada na criao da TRIGGER;
INSTEAD OF: Indica que a TRIGGER ser executada em vez de ser executada a
ao. possvel utilizar a instruo 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 instruo
INSTEAD OF que em vez excluir (DELETE) o registro pela ao ir excluir ao final
da TRIGGER.
CREATE TRIGGER
tg_Cliente_Cadastrar
ON
Cliente
AFTER INSERT
AS
INSERT INTO
ClienteLog
SELECT
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
28
ClienteID,
GETDATE(),
INSERT
FROM
Cliente
O exemplo acima ir inserir no log da tabela Cliente (ClienteLog) todos os IDs depois
de ocorrer a execuo do INSERT na tabela Cliente.
Caso precise alterar a TRIGGER, basta substituir a palavra CREATE por ALTER e
adicionar a nova consulta.
Existem diversos parmetros que pode ser passados para uma TRIGGER, mas no vou
me aprofundar muito.
Fonte: MSDN Microsoft

Somando valores em SQL

Muitas vezes necessrio obter a somatria dos valores para uma amostragem
posterior. A instruo a seguir demonstrar como retornar a somatria parcial de
compras agrupadas por fornecedor e por ltimo ir mostrar a somatria total destes
valores.
SELECT
ID,
SUM(ValorTotal) Valor Total do Fornecedor,
GROUPING(ID) GRP
FROM
Compra
GROUP BY
ID
WITH ROLLUP
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
29
Como podem ver uma instruo comum de agrupamento exceto pela instruo
GROUPING. Esta instruo indica 0 quando o agrupamento no corresponde ao total
somado e 1 quando o total de todos os valores do campo somados, possibilitando
assim saber qual o valor parcial e total em apenas uma consulta. J a instruo
ROLLUP permite agregar valores conforme as condies estabelecidas.
Permitir e/ou Negar acesso a uma tabela em SQL

Que a linguagem SQL tem muitas utilidades e facilidades j sabemos e hoje andei
pesquisando algo sobre permitir ou negar um tipo de consulta (INSERT, UPDATE,
DELETE e SELECT) de uma determinada tabela um determinado usurio. Isso pode
ajudar a controlar a segurana da informao, caso no queira que um determinado
usurio visualize as informaes por exemplo de um cliente.
Vamos a prtica:
DENY
SELECT
ON
Fornecedor
TO
[alexandre.araujo]
A instruo acima nega a permisso do usurio Alexandre de listar informaes da
tabela Fornecedor. Esta instruo pode ser aplicada em usurios em geral, inclusive de
uma rede. Veja a instruo abaixo:
DENY
SELECT
ON
Fornecedor
TO
[ORGANIZACAO\alexandre.araujo]
Foi colocado o nome da rede barra invertida (\) e depois o usurio que no pode acessar
as informaes. Este exemplo pode incluir instrues em geral.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
30
DENY
SELECT,
INSERT,
UPDATE
ON
Fornecedor
TO
[ORGANIZACAO\alexandre.araujo]
Pronto, o usurio acima apenas poder exclui registro da tabela Fornecedor. Agora
vocs devem estar perguntando: Como fao para voltar ao normal? Simples, substitua a
instruo DENY por GRANT. Veja o exemplo abaixo:
GRANT
SELECT,
INSERT,
UPDATE
ON
Fornecedor
TO
[ORGANIZACAO\alexandre.araujo]
Agora sabemos como negar e autorizar o acesso de uma tabela.

Retornando uma consulta SQL em XML

Depois de algum tempo sem postar, estou de volta. Estive um pouco ocupado e em
busca de novos conhecimentos. Mas chega de ficar falando besteira e vamos ao que
realmente interessa.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
31
Estive pesquisando e encontrei uma maneira de gerar a sada de uma consulta no
formato XML utilizando uma consulta em SQL.
SELECT
Clientes.ID,
Pedidos.Descricao,
Clientes.Nome
FROM
Clientes,
Pedidos
WHERE
Clientes.Nome LIKE %Alexandre%
ORDER BY
Pedidos.ID
FOR XML AUTO
A consulta acima exibir como resultado (em formato XML) os clientes que contenham
Alexandre no nome ordenando pelo(s) pedido(s) existente(s).
A clusula AUTO cria uma hierarquia dos elementos retornados automaticamente. Ex.:
Existe o cliente Alexandre e o mesmo possue dois pedidos, neste caso o retorno do
XML ser similar a este:
<Clientes ID=1 Nome=Alexandre>
<Pedidos Descricao=Pedido Pendrive 4GB/>
<Pedidos Descricao=Pedido Televisor 29pol/>
</Clientes>
Os ns de pedidos esto entre os clientes, criando assim uma hierarquia.
Provavelmente continuarei este artigo posteriormente, porque existe outras maneiras de
utilizar esta tcnica. At a prxima.

Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
32
Acessando remotamente um servidor em SQL

Vou abordar um assunto um pouco diferente dos anteriores, explicarei passo-a-passo de
como criar uma conexo com um servidor remoto em uma mesma rede.
Primeiramente abra o SQL Server Enterprise Manager, aps a abertura, maximize a
raiz Microsoft SQL Servers e logo aps o SQL Server Group. Feito isto, clique com
o boto direito sobre o item SQL Server Group.

Abrir uma janela com o ttulo de Register SQL Server Wizard, clique avanar para
prosseguir. Ser listado todos os servidores encontrados pelo SQL Server na rede,
selecione o(s) servidor(es) de escolha e clique Add para adicionar, avanar novamente.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
33

Selecione o tipo de autenticao, sendo que o primeiro o login e senha do prprio
Windows e o segundo referente ao SQL Server.

Em seguida ser mostrado o local onde deseja adicionar a conexo. A primeira
corresponde grupos j existentes e a segunda pede-se para criar um grupo. Clique
avanar para prosseguir.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
34

Pronto, aps feito estes procedimentos a conexo est pronta para ser usada.
Usando o CHARINDEX em SQL
O CHARINDEX uma funo em SQL que retorna a primeira posio de uma
sequencia de caracteres em uma determinada expresso. A primeira posio de
contagem 1.
Sintaxe:
CHARINDEX(expressao1, expressao2 [, posicao_inicial])
expressao1: onde contm a sequencia de caracteres a ser encontrado.
expressao2: onde contm a sequencia de caracteres que ser feito a busca.
Geralmente, usado uma coluna de um campo.
posicao_inicial: um parmetro opcional, que deve-se colocar a posio inicial da
busca, caso omitido, ser iniciado do zero.
Segue abaixo a sintaxe:
SELECT
Nome,
CHARINDEX(papel, Nome) AS Posicao
FROM
Produto
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
35
Na situao acima a busca ser iniciada na primeira posio do campo Nome da tabela
Produto, porque o ltimo parmetro que indica a posio inicial de busca foi omitido.

Como inverter os caracteres em SQL

O SQL possui uma funo que faz a inverso dos caracteres passados como parmetro.
O parmetro informado pode ser constante, variveis, colunas retornadas de um campo
e at mesmo um nmero, seu resultado sempre ser VARCHAR.
Sintaxe:
REVERSE(expresso)
SELECT REVERSE(Alexandre) AS Nome
O resultado da consulta acima ser erdnaxelA, preservando os caracteres maisculos
e/ou minsculos.


Quantidade de processamento em SQL

A palavra-chave @@CPU_BUSY retorna o tempo em milisegundos que a CPU est
utilizando desde a ltima inicializao do SQL Server.
Veja abaixo um exemplo de como usar este recurso:
SELECT @@CPU_BUSY AS CPU ms, GETDATE() AS At
Acima ser mostrado a quantidade de processamento que a CPU utilizou at o momento
da data.

Alterando / Removendo campos de uma tabela
em SQL

Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
36
O ALTER TABLE usado para adicionar e/ou remover colunas de uma determinada
tabela que esteja em um base de dados. Para isto necessrio informar o nome da
tabela, o campo da tabela e caso seja uma adio, ser necessrio passar o tipo do novo
campo.
ALTER TABLE
Cliente
ADD
CPF CHAR(11)
Acima foi criado o campo CPF na tabela Cliente com o tipo CHAR. Para que o
campo aceite valores nulos (NULL), basta adicionar o operador = e em seguida a
palavra NULL.
J para remover um campo de uma tabela ainda mais simples, no havendo a
necessidade de inserir o tipo do campo.
ALTER TABLE
Cliente
DROP COLUMN
CPF
Lembrando que, ao remover um campo de uma tabela, no haver a possibilidade de
voltar atrs (no pelo meu conhecimento), a no ser que faa um backup manual ou algo
parecido.

Como saber as caractersticas de um objeto em SQL

A linguagem SQL possui uma funo que exibe informaes sobre todos os objetos
existentes na base de dados.
Sintaxe:
OBJECTPROPERTY(id, propriedade)
Argumentos:
id -> a identificao do objeto na base de dados, ou seja, uma identificao nica e
que pode ser encontrada na tabela sysobjects. Lembrando que este argumente DEVE
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
37
ser do tipo inteiro.
propriedade -> onde insere a expresso que se deseja obter sobre o objeto.
Segue abaixo todas as propriedades existentes no SQL Server:
Property name
Object
type
Description and values
returned
CnstIsClustKey Constraint
A primary key with a
clustered index. 1 =
True0 = False
CnstIsColumn Constraint
COLUMN constraint. 1
= True0 = False
CnstIsDeleteCascade Constraint
A foreign key constraint
with the ON DELETE
CASCADE
option.
CnstIsDisabled Constraint
Disabled constraint. 1 =
True0 = False
CnstIsNonclustKey Constraint
A primary key with a
nonclustered index. 1 =
True0 = False
CnstIsNotTrusted Constraint
Constraint was enabled
without checking
existing rows, so
constraint may not hold
for all rows. 1 = True0 =
False
CnstIsNotRepl Constraint
The constraint is defined
with the NOT FOR
REPLICATION
keywords.
CnstIsUpdateCascade Constraint
A foreign key constraint
with the ON UPDATE
CASCADE
option.
ExecIsAfterTrigger Trigger AFTER trigger.
ExecIsAnsiNullsOn
Procedure,
Trigger,
View
The setting of
ANSI_NULLS at
creation time. 1 = True0
= False
ExecIsDeleteTrigger Trigger
DELETE trigger. 1 =
True0 = False
ExecIsFirstDeleteTrigger Trigger
The first trigger fired
when a DELETE is
executed against the
table.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
38
ExecIsFirstInsertTrigger Trigger
The first trigger fired
when an INSERT is
executed against the
table.
ExecIsFirstUpdateTrigger Trigger
The first trigger fired
when an UPDATE is
executed against the
table.
ExecIsInsertTrigger Trigger
INSERT trigger. 1 =
True0 = False
ExecIsInsteadOfTrigger Trigger INSTEAD OF trigger.
ExecIsLastDeleteTrigger Trigger
The last trigger fired
when a DELETE is
executed against the
table.
ExecIsLastInsertTrigger Trigger
The last trigger fired
when an INSERT is
executed against the
table.
ExecIsLastUpdateTrigger Trigger
The last trigger fired
when an UPDATE is
executed against the
table.
ExecIsQuotedIdentOn
Procedure,
Trigger,
View
The setting of
QUOTED_IDENTIFIER
at creation time. 1 =
True0 = False
ExecIsStartup Procedure
Startup procedure. 1 =
True0 = False
ExecIsTriggerDisabled Trigger
Disabled trigger. 1 =
True0 = False
ExecIsUpdateTrigger Trigger
UPDATE trigger. 1 =
True0 = False
HasAfterTrigger
Table,
View
Table or view has an
AFTER trigger. 1 =
True0 = False
HasInsertTrigger
Table,
View
Table or view has an
INSERT trigger. 1 =
True0 = False
HasInsteadOfTrigger
Table,
View
Table or view has an
INSTEAD OF trigger. 1
= True0 = False
HasUpdateTrigger
Table,
View
Table or view has an
UPDATE trigger. 1 =
True0 = False
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
39
IsAnsiNullsOn
Function,
Procedure,
Table,
Trigger,
View
Specifies that the ANSI
NULLS option setting
for the table is ON,
meaning all comparisons
against a null value
evaluate to
UNKNOWN. This
setting applies to all
expressions in the table
definition, including
computed columns and
constraints, for as long
as the table exists. 1 =
ON0 = OFF
IsCheckCnst Any
CHECK constraint. 1 =
True0 = False
IsConstraint Any
Constraint. 1 = True0 =
False
IsDefault Any
Bound default. 1 =
True0 = False
IsDefaultCnst Any
DEFAULT constraint. 1
= True0 = False
IsDeterministic
Function,
View
The determinism
property of the function.
Applies only to scalar-
and table-valued
functions. 1 =
Deterministic0 = Not
DeterministicNULL =
Not a scalar- or table-
valued function, or
invalid object ID.
IsExecuted Any
Specifies how this object
can be executed (view,
procedure, or trigger). 1
= True0 = False
IsExtendedProc Any
Extended procedure. 1 =
True0 = False
IsForeignKey Any
FOREIGN KEY
constraint. 1 = True0 =
False
IsIndexed
Table,
View
A table or view with an
index.
IsIndexable
Table,
View
A table or view on
which an index may be
created.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
40
IsInlineFunction Function
Inline function. 1 =
Inline function0 = Not
inline functionNULL =
Not a function, or
invalid object ID.
IsMSShipped Any
An object created during
installation of
Microsoft SQL
Server 2000. 1 =
True0 = False
IsPrimaryKey Any
PRIMARY KEY
constraint. 1 = True0 =
False
IsProcedure Any
Procedure. 1 = True0 =
False
IsQuotedIdentOn
Function,
Procedure,
Table,
Trigger,
View
Specifies that the quoted
identifier setting for the
table is ON, meaning
double quotation marks
delimit identifiers in all
expressions involved in
the table definition. 1 =
ON0 = OFF
IsReplProc Any
Replication procedure. 1
= True0 = False
IsRule Any
Bound rule. 1 = True0 =
False
IsScalarFunction Function
Scalar-valued function. 1
= Scalar-valued0 =
Table-valuedNULL =
Not a function, or
invalid object ID.
IsSchemaBound
Function,
View
A schema bound
function or view created
with
SCHEMABINDING. 1
= Schema-bound0 = Not
schema-boundNULL =
Not a function or a view,
or invalid object ID.
IsSystemTable Table
System table. 1 = True0
= False
IsTable Table Table. 1 = True0 = False
IsTableFunction Function
Table-valued function. 1
= Table-valued0 =
Scalar-valuedNULL =
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
41
Not a function, or
invalid object ID.
IsTrigger Any
Trigger. 1 = True0 =
False
IsUniqueCnst Any
UNIQUE constraint. 1 =
True0 = False
IsUserTable Table
User-defined table. 1 =
True0 = False
IsView View View. 1 = True0 = False
OwnerId Any
Owner of the object.
Nonnull = The database
user ID of the object
owner.NULL = Invalid
input.
TableDeleteTrigger Table
Table has a DELETE
trigger. >1 = ID of first
trigger with given type.
TableDeleteTriggerCount Table
The table has the
specified number of
DELETE triggers. >1 =
ID of first trigger with
given type.NULL =
Invalid input.
TableFullTextBackground Table
The table has full-text
background update index
enabled. 1 = TRUE0 =
FALSE
TableFulltextCatalogId Table
The ID of the full-text
catalog in which the full-
text index data for the
table resides. Nonzero =
Full-text catalog ID,
associated with the
unique index that
identifies the rows in a
full-text indexed table.0
= Table is not full-text
indexed.
TableFullTextChangeTr Table
The table has full-text
change-tracking enabled.
1 = TRUE0 = FALSE
TableFulltextKeyColumn Table
The ID of the column
associated with the
single-column unique
index that is
participating in the full-
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
42
text index definition. 0 =
Table is not full-text
indexed.
TableFullTextPopulate Table
0 = No population1 =
Full population2 =
Incremental population
TableHasActiveFulltext Tables
The table has an active
full-text index. 1 =
True0 = False
TableHasCheckCnst Table
The table has a CHECK
constraint. 1 = True0 =
False
TableHasClustIndex Table
The table has a clustered
index. 1 = True0 = False
TableHasDefaultCnst Table
The table has a
DEFAULT constraint. 1
= True0 = False
TableHasDeleteTrigger Table
The table has a DELETE
trigger. 1 = True0 =
False
TableHasForeignKey Table
The table has a
FOREIGN KEY
constraint. 1 = True0 =
False
TableHasForeignRef Table
Table is referenced by a
FOREIGN KEY
constraint. 1 = True0 =
False
TableHasIdentity Table
The table has an identity
column. 1 = True0 =
False
TableHasIndex Table
The table has an index of
any type. 1 = True0 =
False
TableHasInsertTrigger Table
The object has an Insert
trigger. 1 = True0 =
FalseNULL = Invalid
input.
TableHasNonclustIndex Table
The table has a
nonclustered index. 1 =
True0 = False
TableHasPrimaryKey Table
The table has a primary
key. 1 = True0 = False
TableHasRowGuidCol Table
The table has a
ROWGUIDCOL for a
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
43
uniqueidentifier column.
1 = True0 = False
TableHasTextImage Table
The table has a text
column. 1 = True0 =
False
TableHasTimestamp Table
The table has a
timestamp column. 1 =
True0 = False
TableHasUniqueCnst Table
The table has a UNIQUE
constraint. 1 = True0 =
False
TableHasUpdateTrigger Table
The object has an
Update trigger. 1 =
True0 = False
TableInsertTrigger Table
The table has an
INSERT trigger. >1 = ID
of first trigger with given
type.
TableInsertTriggerCount Table
The table has the
specified number of
INSERT triggers. >1 =
ID of first trigger with
given type.
TableIsFake Table
The table is not real. It is
materialized internally
on demand by SQL
Server. 1 = True0 =
False
TableIsPinned Table
The table is pinned to be
held in the data cache. 1
= True0 = False
TableTextInRowLimit Table
The maximum bytes
allowed for text in row,
or 0 if
text in row option is not
set.
TableUpdateTrigger Table
The table has an
UPDATE trigger. >1 =
ID of first trigger with
given type.
TableUpdateTriggerCount Table
The table has the
specified number of
UPDATE triggers. >1 =
ID of first trigger with
given type.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
44
Nota: Tabela retirada do site MSDN
A propriedade IsIndexable pode consumir significantes recursos de processamento.
A propriedade TableHasActiveFulltextIndex retornar 1 (Verdadeiro) quando no
mnimo uma coluna da tabela adicionada com indce.
Vamos aos exemplos:
A. Para descobrir se um determinado objeto (Veiculo) uma VIEW, basta executar a
seguinte instruo
IF OBJECTPROPERTY(OBJECT_ID(Veiculo), ISVIEW) = 1
PRINT Veiculo uma VIEW
ELSE
PRINT Veiculo no uma VIEW
Observe que utilizei a funo OBJECT_ID, esta funo retorna a identificao do
objeto passado como parmetro, que deve ser o nome do objeto na base de dados. Foi
utilizado esta funo para no haver a necessidade de descobrir a identificao do
objeto.
Caso a necessidade seja outra, como por exemplo, saber se o objeto uma tabela, basta
substituir a palavra-chave ISVIEW por ISTABLE. Como no exemplo abaixo:
IF OBJECTPROPERTY(OBJECT_ID(Veiculo), ISTABLE) = 1
PRINT Veiculo uma TABLE
ELSE
PRINT Veiculo no uma TABLE
B. Saber se uma determinada tabela possui um campo do tipo TEXT, retornar 1
quando for verdadeiro e 0 quando for falso. Uma varivel do tipo booleana.
SELECT OBJECTPROPERTY(OBJECT_ID(Cliente), TableHasTextImage)
C. Saber se uma determinada tabela possui uma chave-primria
SELECT OBJECTPROPERTY(OBJECT_ID(Fornecedor), TableHasPrimaryKey)
D. Saber se uma determinada tabela possui uma TRIGGER SQL que remove
(DELETE) registros
SELECT OBJECTPROPERTY(OBJECT_ID(Cliente), TableDeleteTrigger)
E. Descobrir qual o proprietrio de um determinado objeto, Ex.: PROCEDURE,
TRIGGER, TABLE, etc.
SELECT OBJECTPROPERTY(OBJECT_ID(Veiculo), OwnerId)
Esta funo retorna a identificao do proprietrio do objeto na base de dados ou NULL
caso passado o parmetro incorretamente.
Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
45
Finalizo este artigo por aqui.

A diferena entre DATALENGTH e LEN em SQL

A funo DATALENGTH tem o objetivo retornar o nmero de bytes usados para
representar uma determinada expresso. Esta funo geralmente utilizada em variveis
do tipo VARCHAR, VARBINARY, TEXT, IMAGE, NVARCHAR e NTEXT que
so tipos de dados que podem armazenar grandes quantidades de dados.
Muitos confundem a funo DATALENGTH com a funo LEN, que so totalmente
diferentes, podendo retornar os mesmos valores. A funo LEN tem como intuito
retornar a quantidade de caracteres existentes em uma determinada expresso.
SELECT
LEN(CPF) AS CPF
FROM
Cliente
A instruo acima mostrar a quantidade de caracteres existentes no campo CPF da
tabela Cliente.
SELECT
DATALENGTH(CPF) AS CPF
FROM
Cliente
J esta outra consulta informa o nmero de bytes que o campo de um determinado
registro est ocupando na base de dados. Quando o campo NULL, ou seja, nulo em
portugus, significa que o campo no tem valor nenhum e o retorno da funo
DATALENGTH nulo enquanto o retorno da funo LEN 0, indicando que no
possue nenhum caracter na expresso.

Identificando usurios em SQL

Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
46
A palavra chave USER_NAME no SQL usada para informar o nome do usurio
(como o prprio nome diz). Veja o exemplo abaixo:
SELECT USER_NAME()
No caso acima informar o usurio que est logado na base de dados, se o usurio
estiver em rede ser informado o nome da rede, barra invertida e em seguida o nome do
usurio. Ex.: SQLCOMOUMTODO\alexandre.
O USER_NAME pode receber um parmetro que deve ser o ID do usurio na base de
dados.
SELECT USER_NAME(1)
Na maioria dos casos, o ID 1 corresponde ao usurio dbo.
Para se obter maiores informaes sobre o usurio, deve fazer o filtro na tabela de
gerenciamento de usurios, a sysusers. Esta tabela pode fornecer informaes como:
quando foi criado o usurio (createdate), quando foi atualizado o usurio (updatedate),
se o usurio est logado no momento, entre outras informaes.
SELECT
*
FROM
sysusers
WHERE
name = USER_NAME(1)
A instruo acima retorna a mesma informao da instruo abaixo. Apenas mudando
os campos que so comparados.
SELECT
*
FROM
sysusers
WHERE
uid = 1

Dicas interessantes sobre SQL Server Para iniciantes

Material pesquisado na Internet em: http://sqlcomoumtodo.wordpress.com/
2008
47
Utilizando a clasula TOP em SQL

J expliquei aqui no blog como selecionar uma porcentagem de registros, mas no
expliquei como funciona a clasula TOP sem o PERCENT (indicativo de
porcentagem).
O TOP sem o PERCENT retorna os primeiros registros conforme o nmero
especificado aps a clausula.
SELECT TOP 50
*
FROM
Cliente
A instruo 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 instruo 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.