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.
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 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.
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
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
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
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
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
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
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
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
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.
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.
Assinar:
Postagens (Atom)