You are on page 1of 20

SQL SERVER 2005

Conexão OLEDB do SQL Server 2005

A conexão OLEDB do SQL Server 2005 é feita através do provedor "SQL Native Client ", diferente do SQL Server 2000 que é feita no "Micrisoft OLE DB Provider for SQL Server " . Ex:
[oledb] ; Everything after this line is an OLE DB initstring Provider=SQLNCLI.1;Persist Security Info=False;User ID="";Password="";Initial Catalog="";Data Source=""

Common Language Runtime (CLR)

É o ambiente gerenciado da plataforma .NET e inclui uma série de recursos para gerenciamento de recursos de sua aplicação. No entanto, mesmo com esta forte integração, o Transact-SQL não morreu; continua existindo e teve, inclusive, mudanças visando a melhoria.
http://www.msit.com.br/publicacaoDetalhes.aspx?id=128

Quando o CLR é indicado:

Quando a Stored Procedure necessitar utilizar recursos externos que não são possíveis quando são utilizadas stored procedures T-SQL. Estes recursos podem ser, por exemplo, funções para acessar arquivos, Event Log, Event Viewer, WebService, Registro do Windows, dentre outros. Quando a Stored Procedure contém código procedural. Por exemplo, um processador de arquivos XSLT, uma biblioteca para expressões regulares, uma aplicação que faz diversos cálculos a partir dos dados de várias tabelas. Quando a aplicação possuir funções. Geralmente as funções contêm diversos cálculos, que funcionam melhor quando criados em CLR. Quando a Stored Procedure for procedural e utilizar cursores. Os cursores, comprovadamente, têm uma performance bastante ruim. Via CLR podem ser substituídos por laços “for”.

Quando o T-SQL é recomendado:

Quando há um modelo de programação baseado em conjuntos de dados e há manipulação de dados. Neste caso, a vantagem é pelo fato do otimizador ser empregado e, conseqüentemente, ter uma execução mais rápida. Quando a Stored Procedure necessita executar uma única instrução Transact-SQL. Neste caso, não há necessidade da aplicação chamar o método CLR, que chamará a instrução TSQL e retornará o valor – uma única chamada é necessária; portanto, neste caso, deve-se utilizar o T-SQL.

Row_number

Utilizando a função row_number podemos não só numerar as linhas de uma tabela como também fazer essa numeração em uma ordem específica, diferente da ordem na qual as linhas serão exibidas.

Ex: -- no SQL 2005
select ROW_NUMBER() over ( ORDER BY Quantidade desc ) as Numero, Vendedor, Produto, Quantidade, Telefonemas from Analise_Vendas

-- no SQL 2000 ficaria assim
select ( SELECT COUNT(*) from Analise_Vendas V2 where V2.Quantidade > V.Quantidade or ( V2.Quantidade = V.Quantidade and V2.Telefonemas > V.Telefonemas )) + 1 As Numero , V.Vendedor, V.Produto , V.Quantidade, V.Telefonemas from Analise_Vendas V order by Quantidade Desc , Telefonemas desc

PARTITION BY
Outra opção da sintaxe básica que se chama PARTITION BY, que funciona mais ou menos como o group by, definindo por qual critério nosso ROW_NUMBER deverá ser ressetado. Ex:

select ROW_NUMBER() over ( PARTITION BY Produto ORDER BY Quantidade Desc ) as Numero, Vendedor, Produto, Quantidade from Analise_Vendas

PAGINAÇÃO

Uma outra ídéia para utlizar esta função seria para criar uma páginação para nossa Query, podendo utiliza-lá em alguma página na Web.

Ex:
DECLARE @NumeroDaPagina AS INT, @TamanhoDaPagina AS INT SET @NumeroDaPagina = 2 SET @TamanhoDaPagina = 5 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY Quantidade DESC ) AS Numero, Vendedor, Produto , Quantidade, Telefonemas FROM Analise_Vendas) AS V WHERE Numero BETWEEN (@NumeroDaPagina-1)* @TamanhoDaPagina+1 AND @NumeroDaPagina*@TamanhoDaPagina ORDER BY Quantidade DESC, Telefonemas

RANK() e DENSE_RANK()

RANK e DENSE_RANK atribuem o mesmo valor para as colunas que possuem o mesmo valor dentro da ordem qe foi estabelecida

Ex:
SELECT Vendedor, Produto, Quantidade, --ROW_NUMBER() OVER(ORDER BY Quantidade ASC) AS Numero, RANK() OVER(ORDER BY Quantidade asc) AS Rank --DENSE_RANK() OVER(ORDER BY Quantidade ASC) AS DenseRank FROM Analise_Vendas ORDER BY Quantidade asc

NTILE

Esta função nos permite separar o resultado de uma Query em um determinado número de grupos de acordo com uma ordem.

Ex:
SELECT Vendedor, Produto, Quantidade, ROW_NUMBER() OVER(ORDER BY Quantidade DESC) AS Numero, NTILE(3) OVER(ORDER BY Quantidade DESC) as Grupo FROM Analise_Vendas ORDER BY Quantidade DESC

TOP
O Top foi inserido no SQL 7.0, porém esta clausula no SQL 2005 traz algumas alterações. Permite, por exemplo, o número da percentagem a ser retornada em um SELECT. E pode também ser utilizada também para INSERT, UPDATE e DELETE. Ex:

-- Retorna Linha 1 e Linha 2 SELECT TOP(2) * FROM alunos --Atualiza Linha 1 e Linha 2 para 'S' UPDATE TOP(2) alunos SET Col1='S’ --Apaga as 2 primeiras linhas onde 'S' foi apagado DELETE TOP(2) alunos

PIVOT

A função PIVOT transforma o ajuste de linhas para colunas.
Ex: --TRANSFORMANDO LINHAS EM COLUNAS NO SQL SERVER 2000 select Produto, sum(case Mes when 1 then Valor else 0 end) as Jan, sum(case Mes when 2 then Valor else 0 end) as Fev, sum(case Mes when 3 then Valor else 0 end) as Mar from foo group by Produto --TRANSFORMANDO LINHAS EM COLUNAS NO SQL SERVER 2005 select Produto,[1] as Jan, [2] as Fev,[3] as Mar from (select Valor,Mes,Produto from foo ) P PIVOT ( sum(Valor) for Mes in ([1],[2],[3]) ) as foo

Clausula OUTPUT
As instruções INSERT, DELETE e UPDATE ganharam uma nova clausula, OUTPUT . Ex:

DECLARE @Deletados AS TABLE (materia INT, nome_artita VARCHAR(30)) DELETE aluna OUTPUT DELETED.materia, DELETED.nome_artita INTO @Deletados WHERE materia = 6

Common Table Expressions (CTEs)

As CTEs são um conjunto de dados nomeados sendo muito similares as subconsultas de tabelas derivadas (derived tables) só que com um pouco mais de flexibilidade Elas têm uma definição de uma instrução SELECT como uma visão, e possuem um escopo temporário, mas a sua criação é um pouco diferente. É possível buscar linhas de forma hierárquica, ao contrário do SQL Server 2000 onde é necessário o desenvolvimento de um procedimento para isto.

CTR

Suponha que seja solicitado ao desenvolvedor obter informações sobre as relações hierárquicas presentes no organograma da empresa. Através das CTEs essa tarefa pode ser bem mais fácil.

Veja como ficaria essa Query:

CTR
WITH RelacoesHierarquicas (CodigoEmp, NomeEmp, CargoEmp, CodigoSupEmp) AS -- Retornar dados de todas as relações hierárquicas existentes (SELECT CodigoEmp, NomeEmp, CargoEmp, CodigoSupEmp FROM tbl_empregados UNION ALL SELECT EMP.CodigoEmp, EMP.NomeEmp, EMP.CargoEmp, EMP.CodigoSupEmp FROM tbl_empregados AS EMP INNER JOIN RelacoesHierarquicas AS RH ON EMP.CodigoSupEmp = RH.CodigoEmp) select * from RelacoesHierarquicas as rh select * from tbl_empregados

COMMON TABLE EXPRESSION (CTE)

Uma CTE nada mais é do que uma Result Set com nome baseada num SELECT. Essa Result Set pode ser manipulada por instruções DML e permite pesquisas recursivas. A linguagem T-SQL até então só permitia pesquisas derivadas, ou seja, quando você precisava usar o resultado de uma query em uma outra operação, tinha que armazená-la em uma tabela temporária. Com CTE isso não é mais necessário, em apenas uma operação você consegue fazer tudo que precisa.

DECLARE @TESTE TABLE(NOME VARCHAR(50), ROWNUM INTEGER IDENTITY(1,1)) INSERT INTO @TESTE SELECT nome_aluno FROM alunos SELECT * FROM @TESTE ORDER BY ROWNUM --Quando a CTE não tem referência a si mesma. (Não Recursiva) WITH c_contatos AS (SELECT matricula, nome_aluno,tel_aluno,email_aluno,endereco_aluno,cidade_aluno,uf_aluno FROM alunos where matricula in (1,2,20)) -- Utilização da CTE SELECT * FROM c_contatos

TRY...CATCH
Chamamos este tipo de procedimento de "bloco protegido", onde colocamos o código a ser executado dentro da tag TRY e se ocorrer algum erro, ele automaticamente, passa a executar o código que está dentro da tag CATCH. No SQL Server 2000 se você quisesse saber se o procedimento havia provocado um erro, você checava a variável @@ERROR. BEGIN TRY, é onde começa o código ou query a realizar. Caso ocorra algum erro, o código que está dentro da tag BEGIN CATCH...END CATCH é executado .

 

OBS:
Esta ordem dos fatores é obrigatória, ou seja, deve-se começar com o bloco TRY e logo após o END TRY, deve ser colocaco o bloco CATCH

TRY...CATCH
--Criando a Procedure “adddate1 ” CREATE PROCEDURE adddate1 @a int, @b int AS SET XACT_ABORT ON BEGIN TRY BEGIN TRAN INSERT INTO dbo.DataTable VALUES (@a, @b) COMMIT TRAN END TRY BEGIN CATCH DECLARE @err int SET @err = Error_Number() ROLLBACK TRAN INSERT INTO dbo.ErrorLog VALUES (@a, @b, @err, GETDATE()) END CATCH

Criadores
 

Élida Wagner