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.