Vous êtes sur la page 1sur 18

ZERAR IDENTITY TRUNCATE TABLE NOMEDATABELA OR DBCC Checkident( "tabela", reseed, 0) PEGAR A ULTIMA CHAVE PRIMARIA: SELECT IDENT_CURRENT('TAREFA')

AS ID_TAREFA

Para retornar registros aleatrios, podemos fazer assim: SELECT TOP 10 CAMPO1 , CAMPO2 FROM TABELA1 ORDER BY NEWID()

Se o contedo de um campo for maior que 10, queremos que seja retornada a string ito . Se for menor ou igual a 10 retorna pouco . Fazemos isto utilizando um CASE (estrutura condicional, como um IF de uma lingua gem de programao) para o contedo do campo: SELECT CAMPO1 , TIPO = CASE WHEN CAMPO_VALOR > 10 THEN 'MUITO' WHEN CAMPO_VALOR <= 10 THEN 'POUCO' END , CAMPO3 FROM TABELA1

mu

O SQL Server permite uma leitura seqencial, ou seja ler um registro por vez, atra vs do uso de cursores. Por favor, no confundam estes cursores com os da sua aplicao (ASP, VB, PHP, Java, etc). Este cursores so somente do banco de dados e no podem s er utilizados fora dele. Como este tipo de processamento efetuado linha a linha, recomenda-se que no utili ze muito, pois tem uma perda de performance considervel. Abaixo temos um exemplo de um cursor para uma da tabela com dois campos: /* Cria as variveis que iro armazenar o contedo dos campos devem ser do mesmo tipo dos campos da tabela: */ DECLARE @CAMPO1 VARCHAR(10) DECLARE @CAMPO2 INT /* Declara um cursor para uma instruo SELECT: */ DECLARE CUR_TMP CURSOR FOR SELECT CAMPO1,CAMPO2 FROM TABELA1 /* Abre o curosr: */

OPEN CUR_TMP /* Pula para o prximo registro preenchendo as variveis: */ FETCH NEXT FROM CUR_TMP INTO @CAMPO1,@CAMPO2 /* Loop: enquando no acabar os registros */ WHILE @@FETCH_STATUS = 0 BEGIN /* Mostra na tela o conteudo do CAMPO1 e do CAMPO2 */ SELECT @CAMPO1 , @CAMPO2 /* Pula para o prximo registro preenchendo as variveis */ FETCH NEXT FROM CUR_TMP INTO @CAMPO1,@CAMPO2 END /* Fecha o cursor */ CLOSE CUR_TMP /* Desaloca a memria do cursor */ DEALLOCATE CUR_TMP

Registros afetados Sempre que enviamos uma instruo para o SQL Sever utilizando o Query Analyzer, obte mos uma mensagem que mostra quantos registros foram afetados para a instruo que ac abamos de enviar ao banco, como: (1 row(s) affected). Para evitar que esta mensagem no seja mais retornada, utilize o comando SET NOCOU NT ON. Para voltar a apresentar esta mensagem, utilize o SET NOCOUNT OFF. Esta c onfigurao vlida somente durante o perodo que se est conectado ao banco. Agora, se quisermos limitar quantas linhas uma instruo pode afetar, devemos utiliz ar o SET ROWCOUNT. Exemplo: /* A partir deste comando, somente os dois primeiros registros sero afetados */ SET ROWCOUNT 2 /* Atualiza os dados */ UPDATE TABELA1 SET CAMPO2=0 /* Volta a configurao: sem limites de registros a serem afetados por qualquer inst ruo */ SET ROWCOUNT 0 Utilize este comando com muito cuidado e procure sempre voltar o valor de SET RO WCOUNT para o seu valor anterior, para evitar problemas.

SELECT A declarao SELECT utilizada para selecionar os dados de um banco de dados: SELECT nome FROM clientes WHERE A clusula WHERE usada para extrair apenas os registros que cumprir um determinado critrio: SELECT * FROM clientes WHERE Clie_nome = 'Adelar Poggere' AND & OR

E o operador apresenta um recorde se tanto a condio primeira e segunda condio verda eira: SELECT * FROM clientes WHERE clie_nome ='Adelar Poggere' AND clie_nome = 'Ademar Bonetti' OR: SELECT * FROM clientes WHERE clie_nome ='Adelar Poggere' OR clie_nome = 'Ademar Bonetti' Combinao AND & OR: SELECT * FROM clientes WHERE clie_nome ='Adelar Poggere' AND (clie_nome ='Ademar Bonetti' OR clie_nome='Adelvo Basquera') ORDER BY utilizado para classificar o resultado-estabelecidos por uma determinada coluna: SELECT * FROM clientes ORDER BY clie_nome ASC -- DESC INSERT INSERT INTO A afirmao usada para inserir uma nova linha em uma tabela: INSERT INTO clientes VALUES (4,'Denilson', 'Andrade', 'Rio Grande do Sul', 'Francisco Beltro') UPDATE A declarao UPDATE utilizado para atualizar os registros existentes em uma tabela: UPDATE clientes

SET endereco='Francisco', cidade='Francisco Beltro' WHERE nome='Denilson' AND Sobrenome='Andrade' DELETE O DELETE usado para excluir linhas em uma tabela: DELETE FROM clientes WHERE Nome = 'Denilson' AND Sobrenome = 'Andrade' DISTINCT Em uma tabela, algumas das colunas podem conter valores duplicados. Este no um problema, no entanto, s vezes voc ir querer listar apenas os diferentes ( distintos) valores em uma tabela: SELECT DISTINCT nome FROM clientes Como criar uma View: CREATE VIEW cli AS SELECT * FROM clientes WHERE clie_codigo = '20498'; LIKE Localiza todos os cliente cujo nome termina com "s" da tabela "Clientes": SELECT * FROM clientes WHERE clie_nome LIKE '%s'; Localiza todos os cliente cujo nome inicia com "S" da tabela "Clientes": SELECT * FROM clientes WHERE clie_nome LIKE 'S%'; Localiza todos os cliente cujo nome contenha "Den" da tabela "Clientes": SELECT * FROM clientes WHERE clie_nome LIKE '%Den%'; Localiza todos os cliente cujo nome no contenha "Den" da tabela "Clientes": SELECT * FROM clientes WHERE clie_nome NOT LIKE '%Den%' Localiza todas os Clientes com a segunda letra "e" independente do primeira cham ado coringa: SELECT * FROM clientes WHERE UPPER(clie_nome) LIKE '_E%' IN Localiza apenas os clientes cujo codigo seja igual a '20037','20500','20501','20 917': SELECT * FROM clientes

WHERE clie_codigo IN ('20037','20500','20501','20917') Localiza Todos os clientes cujo codigo seja diferente de 20037','20500','20501', '20917': SELECT * FROM clientes WHERE clie_codigo NOT IN ('20037','20500','20501','20917') BETWEEN O operador seleciona uma srie de dados entre dois valores. Os valores podem ser nm eros, texto ou datas. Localiza Todos os clientes cujo codigo seja de "1" a "100": SELECT * FROM clientes WHERE clie_codigo BETWEEN '01' AND '100' Alias Voc pode dar uma tabela ou uma coluna outro nome usando um alias. Isto pode ser u ma boa coisa a se fazer se o nome da tabela ou coluna forem muto complexos. Alias de colunas: SELECT clie_codigo AS cod,* FROM clientes Alias de tabelas: SELECT c.clie_codigo, c.Clie_nome FROM clientes AS c WHERE c.clie_codigo='1' JOIN A palavra-chave JOIN usada em uma instruo SQL para consultar os dados de duas ou m ais tabelas, com base em uma relao entre determinadas colunas nestas tabelas. Tabelas em um banco de dados so, muitas vezes, relacionadas umas s outras com as t eclas. Uma chave primria uma coluna (ou uma combinao de colunas), com um valor nico para ca da linha. Cada chave primria valor deve ser exclusivo dentro da tabela. O objetivo vincular os dados em conjunto, em tabelas, sem repetio de todos os dado s em cada tabela. INNER JOIN Regresso filas quando h, pelo menos, um jogo em ambas as tabelas: SELECT * FROM clientes INNER JOIN movfiscal ON clie_codigo = mfis_codentidade WHERE clie_codigo = '20301' LEFT JOIN Retornar todas as linhas da tabela esquerda, mesmo quando no h jogos no quadro do direito:

SELECT * FROM clientes LEFT JOIN movfiscal ON clie_codigo = mfis_codentidade WHERE clie_codigo = '20301' RIGHT JOIN Retornar todas as linhas da tabela direita, mesmo se no houver jogos no quadro da esquerda: SELECT * FROM clientes RIGHT JOIN movfiscal ON clie_codigo = mfis_codentidade WHERE clie_codigo = '20301' FULL JOIN Regresso filas quando h um jogo em um dos quadros: SELECT * FROM clientes FULL JOIN movfiscal ON clie_codigo = mfis_codentidade WHERE clie_codigo = '20301' UNION O operador UNION usado para combinar o resultado-conjunto de dois ou mais SELECT . Observe que cada SELECT declarao no mbito da Unio devem ter o mesmo nmero de colunas. As colunas devem ter tambm os tipos de dados semelhantes. Alm disso, as colunas em cada SELECT declarao deve ser na mesma ordem: SELECT clie_codigo, clie_nome FROM clientes UNION SELECT mfis_codentidade, mfis_historico FROM movfiscal UNION ALL: SELECT clie_codigo, clie_nome FROM clientes UNION ALL SELECT mfis_codentidade, mfis_historico FROM movfiscal SELECT INTO A declarao SELECT INTO seleciona dados de uma tabela e insere-lo em uma tabela dif erente. A declarao SELECT INTO mais frequentemente usado para criar cpias de segurana das ta belas: SELECT * INTO new_Clientes FROM Clientes SELECT INTO Juntando tabelas:

SELECT clie_codigo,mfis_historico INTO new_junta FROM Clientes INNER JOIN movfiscal ON clie_codigo = mfis_codentidade WHERE clie_codigo = '20301' CREATE DATABASE A declarao CREATE DATABASE utilizado para criar um banco de dados: CREATE DATABASE teste CREATE TABLE O CREATE TABLE usado para criar uma tabela em um banco de dados: CREATE TABLE Clientes ( cod int, Nome varchar(255), SobreNome varchar(255), endereco varchar(255), Cidade varchar(255) ) SQL Constraints Restries so utilizados para limitar o tipo de dados que pode ir em uma tabela. Constrangimentos pode ser especificado quando uma tabela criada (com CREATE TABL E), ou aps a tabela criada (com o ALTER TABLE). Iremos focar as seguintes restries: NOT NULL; UNIQUE; PRIMARY KEY; FOREIGN KEY; CHECK; DEFAULT; NOT NULL. CREATE TABLE Clientes ( cod int NOT NULL, Nome varchar(255) NOT NULL, SobreNome varchar(255), endereco varchar(255), Cidade varchar(255) ) UNIQUE O nico condicionalismo identifica exclusivamente cada registro em um banco de dad os tabela: CREATE TABLE Clientes (

cod int NOT NULL UNIQUE, Nome varchar(255) NOT NULL, SobreNome varchar(255), endereco varchar(255), Cidade varchar(255) ) PRIMARY KEY A PRIMARY KEY constraint identifica exclusivamente cada registro em um banco de dados tabela: CREATE TABLE Clientes ( cod integer PRIMARY KEY, Nome varchar(255) NOT NULL, SobreNome varchar(255), endereco varchar(255), Cidade varchar(255) ) FOREIGN KEY Uma chave estrangeira em uma tabela aponta para uma PRIMARY KEY em uma outra tab ela: CREATE TABLE Fiscal ( id integer PRIMARY KEY, cod integer REFERENCES Clientes (cod), transacao integer ) Ou: CREATE TABLE Fiscal ( Id int NOT NULL, transacao int NOT NULL, PRIMARY KEY (Id), FOREIGN KEY (cod) REFERENCES Clientes(cod) ) CHECK usada para limitar o valor intervalo que pode ser colocado em uma coluna: CREATE TABLE Clientes ( cod int NOT NULL CHECK (Cod > 0), Nome varchar(255) NOT NULL, SobreNome varchar(255), endereco varchar(255), Cidade varchar(255) ) DEFAULT utilizado para inserir um valor padro para uma coluna:

CREATE TABLE Clientes ( cod int NOT NULL , Nome varchar(255) NOT NULL, SobreNome varchar(255), endereco varchar(255), Cidade varchar(255)DEFAULT 'Dois Vizinhos' ) CREATE INDEX Um ndice pode ser criado em uma tabela para encontrar os dados de forma mais rpida e eficiente. Os usurios no podem ver os ndices, eles so usados apenas para acelerar pesquisas/con sultas: CREATE INDEX index_name ON Clientes (Nome) Ou: CREATE INDEX index_name ON new_junta (clie_codigo) DROP INDEX utilizado para excluir um ndice em uma tabela: DROP INDEX index_name; ALTER TABLE usado para adicionar, apagar ou alterar colunas em uma tabela existente. ADD: ALTER TABLE Clientes ADD Nome01 varchar(150); DROP: ALTER TABLE Clientes DROP COLUMN Nome01; ALTER: ALTER TABLE Clientes ALTER COLUMN Nome01 TYPE VARCHAR(30); RENAME para mudar o nome da coluna: ALTER TABLE Clientes RENAME COLUMN Nome01 TO Nome02; RENAME para mudar o nome da tabela: ALTER TABLE Clientes RENAME TO Clientes01; AUTO INCREMENT Muitas vezes, gostaramos que o valor da chave primria campo a ser criado automatic

amente cada vez que um novo registro seja inserido: CREATE TABLE Clientes ( Cod int NOT NULL AUTO_INCREMENT, Nome varchar(255) NOT NULL, SobreNome varchar(255), endereco varchar(255), Cidade varchar(255), PRIMARY KEY (Cod) ) Funo NOW pega data e hora: SELECT NOW() NULL "IS": SELECT * FROM Clientes WHERE clie_codigo IS NULL SELECT * FROM Clientes WHERE clie_codigo IS NOT NULL Funes SQL agregadas AVG() COUNT() MAX() MIN() SUM() Retorna o - Retorna Retorna o Retorna o Devolve a valor mdio; o nmero de linhas; maior valor; menor valor; soma.

SELECT AVG(clie_codigo) FROM Clientes SELECT COUNT(clie_codigo) FROM Clientes SELECT MAX(clie_codigo) FROM Clientes SELECT MIN(clie_codigo) FROM Clientes SELECT SUM(clie_codigo) FROM Clientes GROUP BY

A declarao GROUP BY utilizada em conjugao com as funes agregadas ao grupo o resulta definido por um ou mais coluna: SELECT SUM(clie_codigo) FROM Clientes GROUP BY clie_codigo HAVING A clusula HAVING foi adicionado ao SQL porque a palavra-chave WHERE no pode ser ut ilizado com funes agregadas: SELECT SUM(clie_codigo) FROM Clientes GROUP BY clie_codigo HAVING SUM(clie_codigo)<2000 UPPER

UPPER() funo converte o valor de um campo com letras maisculas: SELECT UPPER(clie_nome) FROM Clientes LOWER LOWER() funo converte o valor de um campo com letras minsculas: SELECT LOWER(clie_nome) FROM Clientes ROUND A funo ROUND() utilizada para arredondar um campo numrico para o nmero de casas deci mais especificado: SELECT ROUND(clie_codigo,12) FROM Cliente

Esta dicas podem ser aplicadas em quase todos os bancos de dados que utilizem pa dro ANSI. Uso do Select * Sempre que possvel evitar o uso de select * mesmo que a Stored Procedure retorne todos as colunas de uma tabela. Com isso, garante-se a segurana e manutenabilidad e da SP, pois sabe-se exatamente quais parmetros ela retorna assim que se visuali za o seu cdigo. Uso de > ou >= Situao: A query : CODE select c1,c2 from t where a > 3 e a tabela possui ndice em a.. Se houver muitas linhas com a = 3, o engine do banco de dados far scan de muitas pginas at encontrar a > 3. mais eficiente se escrita da forma: CODE select c1,c2 from t where a >= 4 Exists ou Not Exists De maneira geral o uso de EXISTS e IN mais eficiente que NOT EXISTS e NOT IN. Situao: CODE if not exists ( select a from t where a = 3 ) begin .....grupo 1 end else begin .....grupo 2 end mais eficiente se escrita da forma CODE if exists ( select a from t where a =3 ) begin ... grupo 2 end else begin ... grupo 1

end No SELECT de um EXISTS tomar cuidado para no colocar * ou colunas que no sejam ndic e cluster, pois o EXISTS no necessita retornar colunas somente verificar se a linha existe ou no. Assim, ut ilizar if exists: CODE select 1 from t where a > 3 ao invs de if exists: CODE ( select * from t where a > 3) Subqueries com clusula de outer-join restritiva CODE select w from outer where y = 1 and x = (select sum(a) from inner where inner.b = outer.z ) Ser quebrada pelo bancod e dados nos seguintes passos CODE select outer.z, summ = sum(inner.a) into #work from outer, inner where inner.b = outer.z and outer.y = 1 group by outer.z select outer.w from outer, #work where outer.z = #work.z and outer.y = 1 and outer.x = #work.summ O bancod de dados copia a clusula search ( y = 1 ) para a subquery, mas no copia c lusula join. Isto porque copiando a clusula search, sempre tornar a query mais efic iente, mas copiando a clusula join pode em muitos casos tornar a query mais lenta . A cpia da clusula join s eficiente quando ela extremamente restritiva, mas o banc o de dados faz a quebra antes do otimizador atuar. Ento, para tornar a query mais eficiente, conhecendo previamente a alta restritividade da clusula join, pode-se copiar a clusula join para a subquery como no exemplo abaixo : tab_x -> tabela grande tab_y -> tabela pequena CODE select a from tab_x, tab_y where tab_x.coluna_valor_unico = tab_y.a and tab_x.b = ( select s um from tabela_interna where tab_x.d = tabela_interna.e and tab_x.coluna_valor_un ico = tab_y.a) Criao de tabelas dentro de stored procedures Quando uma tabela criada e utilizada dentro de uma mesma stored procedure, o oti mizador no tem conhecimento das suas estatsticas, e assume que esta tabela tem 100 linhas e 10 pginas. Se a tabela criada muito grande, esta suposio pode levar o oti mizador a calcular um plano de acesso no otimizado. Para evitar este problema, cr ie a tabela em uma procedure e utilize-a em outra. Isto ser objeto de especificao d urante o Diagrama de Cenrios.

Variveis ou parmetros na clusula where O otimizador no tem informaes sobre o valor de uma varivel, mas, em tempo de compilao sabe o valor de um parmetro. Isso posto, a utilizao de parmetros em clusula where, l eva o otimizador a produzir um plano de acesso mais eficiente. Por exemplo, a procedure

CODE create procedure s_p1 as declare @x int select @x = b1 from t where a1 = 3 select a from t2 where b1 = @x pode ser reescrita como : create procedure s_p1 as declare @x int select @x = b1 from t where a1 = 3 exec s_p2 @x create s_p2 @x int as select a from t2 where b1 = @x COUNT x EXISTS Para testes de existncia sempre mais eficiente utilizar EXISTS do que COUNT. Quan do se utiliza o COUNT o banco de dados no sabe que se est fazendo um teste de exis tncia e continua pesquisando todas as linhas qualificadas. J utilizando EXISTS, o banco de dados sabe que um teste de existncia e interrompe a pesquisa quando enco ntra a primeira linha qualificada. Este mesmo raciocnio vlido quando se utiliza COUNT no lugar de IN ou ANY. OR x UNION O banco de dados no consegue otimizar clusulas de join ligadas por OR. Neste caso mais eficiente ligar os conjuntos de resultados por UNION. Por exemplo : CODE select a from tab1,tab2 where tab1.a = tab2.a OR tab1.x = tab2.x pode ser reescrito como : CODE select a from tab1, tab2 where tab1.a = tab2.a UNION select a from tab1, tab2 where tab1.x = tab2.x A diferena que na segunda forma, so eliminadas as linhas duplicadas, o que pode se r contornado com UNION ALL. MAX e MIN Agregados O banco de dados utiliza uma otimizao especial para MAX e MIN quando h um ndice na c oluna agregada. Para o MIN a pesquisa interrompida quando encontra a primeira li nha qualificada. Para o MAX, o banco de dados vai diretamente para o final do ndice e pega a ltima linha. Os casos onde estas otimizaes especiais no so utilizadas: a expresso do MAX ou MIN no uma coluna. a coluna do MAX ou MIN no a primeira do ndice existe outro comando agregado na query. existe uma clusula de GROUP BY. se existe clusula WHERE, a otimizao especial de MAX no utilizada.

Se houver possibilidade de se conseguir otimizao especial, vale a pena separar em vrias queries. mais eficiente utilizar o ndice vrias vzes, do que fazer scan table u

ma nica vez. Em alguns casos, pode ser mais eficiente no utilizar a otimizao especial do MIN. Po r exemplo, se h uma clusula where em outro ndice, quanto mais restritivo for o WHER E, menos eficiente fica a otimizao especial do MIN. A soluo convencer o otimizador a no utilizar a otimizao especial do MIN, colocando, por exemplo, duas agregaes na que ry. Por exemplo : CODE select MIN(coluna1) from tab where coluna2 = <valor encontrado s no final do ndice da colu na1> O banco de dados utilizar aqui a otimizao especial do MIN, e far um scan em quase to do o ndice, pois a qualificao na clusula WHERE fora esta situao. Se colocarmos mais aggregate, convenceremos o otimizador a utilizar o processo normal, criando um p lano de acesso pelo ndice da coluna2, neste caso, mais eficiente que a otimizao esp ecial do MIN. CODE select MIN(coluna1), MAX[coluna2) from tab where coluna2 = <valor encontrado s no final do ndice da colu na1> Joins e Datatypes Se a clusula join utiliza datatypes diferentes, um deles ser convertido para o out ro. O datatype convertido o hierarquicamente inferior. O otimizador no consegue e scolher um ndice na coluna que convertida. O ideal evitar este tipo de join, mas se no for possvel, pode-se explicitamente co nverter o lado do join que tem o menor custo de no utilizao do ndice. Por exemplo : CODE select c1,c2 from tab1, tab2 where tab1.col_char_75 = convert ( char(75), tab2.col_varchar_7 5 ) Parmetros e Datatypes O otimizador pode utilizar o valor de um parmetro para calcular o custo de um pla no. Mas o banco de dados no poder utilizar valores de parmetros convertidos. O idea l ento garantir que o parmetro tem o mesmo datatype da coluna com a qual ele ser co mparado. Por exemplo : CODE create procedure s_p @x varchar(30) as select c1,c2 from tab where coluna_char_3 0 = @x pode ser reescrito como: CODE create procedure s_p @x char(30) as select c1,c2 from tab where coluna_char_30 = @x Testar retorno de comando SQL

Aps um comando SQL (select, insert, update, delete) sempre necessrio testar duas v ariveis para um correto processamento da Stored Procedure: @@error (cdigo de retor no do banco de dados ) e @@rowcount (quantidade de linhas retornadas pelo comand o). Estas variveis devem ser testadas para que a SP possa dar como retorno os cdig os de erro -1001 (erro banco de dados ) e -1002 (no encontrou registro). No caso do raiserror, retornar 40001 e 40002 respectivamente. Para testar siga o exemplo: CODE declare @erro smallint, @numlin smallint select a from t where a > 3 /* sempre salvar o valor de @@error em uma varivel pois para cada comando SQL o banco de dados gera um @@error. */ select @erro = @@error @numlin = @@rowcount if @erro != 0 return -1001 if @numlin = 0 return -1002 /* erro banco de dados */ /* no encontrou registro */

Stored Procedure chamadora Para as SPs consideradas chamadoras, ou seja, aquelas que chamam outras SPs deve-se tomar um cuidado especial com os cdigos de retorno (vide quadro de cdigos) . Alm dos cdigos padronizados (0, -1001, -1002, ...) a SP ainda pode retornar cdigo s prprios dela durante a execuo (cdigos -1 a -14). Estes cdigos sinalizam que houve a lgum tipo de problema para a execuo da SP: no achou a SP, no existe permisso para exe cut-la, entre outras. Testar na SP chamadora estes cdigos de retorno tambm. Exemplo: CODE create procedure s_teste as declare @return int

/* p/ cdigo de retorno */

/* executa s_teste2 buscando seu cdigo de retorno */ execute @return = s_teste2 /* testa retorno de s_teste2 */ if @return != 0 begin raiserror 40001 return -1001 /* erro banco de dados */ end else begin raiserror 40000 return 0 /* OK */ end Utilizao do comando RAISERROR O uso do RAISERROR no cdigo obrigatrio para as SPs chamadoras ou que retornem mltipl as todoss da mesma tabela ou de tabelas diferentes. Isto faz-se necessrio para fac ilitar e viabilizar o controle de erros nas aplicaes PowerBuilder. O RAISERROR dev e ser colocado antes de todos os returns do cdigo da SP. Ver padronizao dos cdigos no quadro CDIGOS DE RETORNO. Nas demais SPs

fica a critrio do coordenador de cada equipe de desenvolvimento, a deciso pela obr igatoriedade da utilizao do RAISERROR. Exemplo: vide cdigo SP do item acima. Uso de campos formato DATA (smalldatetime e datetime) Tomar bastante cuidado com a utilizao de campos no formato DATA, principalmente pa ra utilizao de datas zeradas e datas com 99999999. No banco de dados este conceito perdeu o sentido pois s so aceitas datas vlidas para um campo formato DATA. Assim, utilizar 1900/01/01 para representar DATA = 0 e 2070/12/31 para representar DATA = 99999999. Estas datas so os limites abaixo e acima para os campos smalldatetime. Para casos aonde este range no seja suficiente, buscar orientao com o Suporte/Adm. de Dados.

Exemplo 01 CODE DECLARE @TMP TABLE (NU_DOC INT, IC_ACEITO CHAR(1)) INSERT INTO @TMP (NU_DOC, IC_ACEITO, VALOR) VALUES (1,'A') INSERT INTO @TMP (NU_DOC, IC_ACEITO, VALOR) VALUES (2,'C') INSERT INTO @TMP (NU_DOC, IC_ACEITO, VALOR) VALUES (3,'') SELECT NU_DOC, IC_ACEITO, CASE rtrim(ltrim(IC_ACEITO)) WHEN 'A' THEN 'Aceito' WHEN 'C' THEN 'Cancelado' ELSE 'No avaliado' END @TMP

FROM

Exemplo 02 CODE DECLARE @TAB TABLE (CODIGO VARCHAR(10), MES VARCHAR(10) , VALOR DECIMAL(12,2)) INSERT INTO @TAB (CODIGO, MES , VALOR ) VALUES ('0101', '012003', 415235.25) INSERT INTO @TAB (CODIGO, MES , VALOR ) VALUES ('0101', '022003', 15235.45) INSERT INTO @TAB (CODIGO, MES , VALOR ) VALUES ('0101', '032003', 41535.78) INSERT INTO @TAB (CODIGO, MES , VALOR ) VALUES ('0101', '042003', 41523.20) INSERT INTO @TAB (CODIGO, MES , VALOR ) VALUES ('0201', '012003', 8564.25) INSERT INTO @TAB (CODIGO, MES , VALOR ) VALUES ('0201', '022003', 758.45)

INSERT INTO @TAB (CODIGO, MES , VALOR ) VALUES ('0201', '032003', 35.78) INSERT INTO @TAB (CODIGO, MES , VALOR ) VALUES ('0201', '042003', 23.20) SELECT * FROM @TAB SELECT CODIGO, SUM(CASE SUBSTRING(MES,1,2) SUM(CASE SUBSTRING(MES,1,2) SUM(CASE SUBSTRING(MES,1,2) SUM(CASE SUBSTRING(MES,1,2) FROM @TAB GROUP BY CODIGO SELECT P1.*, (P1.DIA1 + P1.DIA2 FROM (SELECT CODIGO, SUM(CASE SUBSTRING(MES,1,2) SUM(CASE SUBSTRING(MES,1,2) SUM(CASE SUBSTRING(MES,1,2) SUM(CASE SUBSTRING(MES,1,2) FROM @TAB P GROUP BY CODIGO) AS P1 WHEN WHEN WHEN WHEN '01' '02' '03' '04' THEN THEN THEN THEN VALOR VALOR VALOR VALOR ELSE ELSE ELSE ELSE 0 0 0 0 END) END) END) END) AS AS AS AS DIA1, DIA2, DIA3, DIA4

+ P1.DIA3 + P1.DIA4) AS TOTAL_ANO WHEN WHEN WHEN WHEN '01' '02' '03' '04' THEN THEN THEN THEN VALOR VALOR VALOR VALOR ELSE ELSE ELSE ELSE 0 0 0 0 END) END) END) END) AS AS AS AS DIA1, DIA2, DIA3, DIA4

Introduo Todo programador sempre obrigado a trabalhar com mais de uma linguagem, precisa entender pelo menos HTML, JavaScript e sua linguagem escolhida, alm da sintaxe SQ L para acesso banco de dados. Nos meus primeiros anos de programao SQL, sempre gastava horas pesquisando sintaxe pelas pginas de resultado do Google e alguns comandos exticos nunca ficavam fixad os em mente, visto que eram utilizados com freqncia muito baixa. Pensando nisso, c erto dia criei um arquivo vazio e comecei a anotar as queries menos comuns e no m enos teis e hoje resolvi compartilhar este pedao do meu dirio de programador aqui n o Viva o Linux.com.br. Criao de usurios GRANT ALL PRIVILEGES ON meuBD.* TO joao@localhost IDENTIFIED BY 'ola' WITH GRANT OPTION; FLUSH PRIVILEGES; Descrio: atribui todos os privilgios todas as tabelas do banco de dadosmeuBD ao usur io joao, a partir da mquina localhost, cuja senha ola. O comando FLUSH PRIVILEGES atualiza as novas alteraes no daemon do MySQL. Caso o usurio joao no existe, um nov o usurio ser criado. Funes de data e hora SELECT * FROM table WHERE MONTH(data)='05'; Descrio: seleciona todos os registros da tabela table onde o campo data possui a d ata no ms de Maio. SELECT DISTINCT DAYOFMONTH(data),MONTH(data),YEAR(data);

Descrio: seleciona o dia do ms, ms e ano sem repetir da tabela table. SELECT DATE_FORMAT(campoData,'%d-%m-%Y') FROM table; Descrio: formata o campoData no seguinte formato: dd/mm/yyyy. Maiores detalhes sob re a funes DATE_FORMAT podem ser encontradas atravs da URL: http://www.mysql.com/do c/en/Date_and_time_functions.html. Importando e exportando arquivos LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'; Descrio: carrega os registros em formato txt do arquivo data.txt para a tabela tbl _name, onde os campos esto separados por ',' (vrgula), delimitados por '"' (aspas) e as linhas delimitadas por '\n' (quebra de linha). SELECT * INTO OUTFILE 'saida.txt' FROM table; Descrio: seleciona todos os registros da tabela table e os grava no arquivo saida. txt. Transferindo registros de uma tabela para outra INSERT INTO table1 (nome) SELECT nome FROM table2; Descrio: insere todos os nomes da tabela table2 na tabela table1. Continue acompanhando este artigo, aos poucos vou adicionando mais dicas e truqu es SQL.

Vous aimerez peut-être aussi