Mostrando postagens com marcador dicas. Mostrar todas as postagens
Mostrando postagens com marcador dicas. Mostrar todas as postagens

quarta-feira, 22 de dezembro de 2010

Armazenando o select de uma Stored Procedure SQL

Para armazenar o select de uma stored procedure, no sql 2005 eh um pouco diferente.
precisa seguir alguns passos:

- precisa ter um linked server configurado.
- chamar a rotina que retornara o conteudo da proc.

configurando o linked server:


exec sp_addlinkedserver
@server = '[nome que vc dara ao link]',
@srvproduct = '',
@provider = 'SQLNCLI',--FICA ASSIM MESMO
@provstr = 'DRIVER={SQLServer};SERVER=[IP DO SEU SERVIDOR ONDE ESTA A SUA BASE];UID=[LOGIN];PWD=[SENHA];'
 
feito isso teremos o link configurado.
agora basta chamar a rotina assim:
 
 

select * from openquery([nome dado ao link],
'execute [Teste_RetornoProc])
 
com isso pode-se inserir o retorno em qualquer tabela, tanto temporaria ou variavel, ou mesmo tabela fisica.

Armazenando o retorno de uma Stored Procedure SQL

Esse eu perdi um tempinho procurando pois nao sabia como funcionava, mas achei um tutorial da microsoft e fiquei besta da facilidade:

Ex.
--proc exemplo
create procedure Teste_RetornaStatus
@contratoId as int
as begin
   select contratoStatus
   from contrato
   where contratoId = @contratoId
end

--executando a proc
declare @status as int

--armazenando o retorno da procedure (simples)
execute @status = Teste_RetornaStatus @contratoId = 12

pronto , o retorno esta na variavel @status.

segunda-feira, 20 de dezembro de 2010

Cláusula OUTPUT

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

Ex:
--declarando uma tabela que ira receber os dados
DECLARE @Deletados AS TABLE (materia INT, nome_artita VARCHAR(30))

--executando o codigo e abastacendo a tabela
DELETE aluna OUTPUT
DELETED.materia,
DELETED.nome_artista
INTO @Deletados
WHERE materia = 6

PIVOT - transformando linhas em colunas

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

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

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

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

domingo, 19 de dezembro de 2010

Paginação

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

Partition by

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

Row_Number

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

sexta-feira, 17 de dezembro de 2010

UNION ALL vs UNION e ordenação

Se você sabe que não pode haver valores duplicados entre duas tabelas, então sempre use UNION ALL. Ele salva o banco de dados de realizar diversas triagens para ordenação dos seus dados.



Seu DBA não estará satisfeito com você se usar UNION desnecessariamente. É uma característica padrão do UNION realizar ordenação, mesmo sem a existência da opção de ORDER BY.