Dicas de Consultas SQL Server

Embed Size (px)

Citation preview

  • 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

  • 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

  • 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:

    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.