Hoje examinei a cláusula de saída no SQL Server 2005 para que você possa retornar dados para variáveis de tabela a partir de instruções de modificação (INSERT, UPDATE, DELETE). Cenários úteis para DML com resultados incluem limpeza e arquivamento, aplicativos de mensagens e outros cenários. A sintaxe desta nova cláusula OUTPUT é:
OUTPUT <dml_select_list> INTO @table_variable
pode acessar a imagem antiga/nova da linha modificada referenciando a tabela inserida e a tabela excluída, de maneira semelhante ao acesso aos gatilhos. Numa instrução INSERT, apenas a tabela inserida pode ser acessada. Em uma instrução DELETE, apenas tabelas excluídas podem ser acessadas. Na instrução UPDATE, você pode acessar tabelas inseridas e tabelas excluídas. A seguir está um exemplo do MSDN:
Como exemplo de um esquema de limpeza e arquivamento que pode ser útil para DML com resultados, suponha que você tenha uma tabela de Pedidos grande e queira limpar dados históricos regularmente. Você também deseja copiar os dados eliminados para uma tabela de arquivo chamada OrdersArchive. Você declara uma variável de tabela chamada @DeletedOrders e insere um loop no qual exclui dados históricos em partes (por exemplo, pedidos anteriores a 2003). O código adicionado aqui é a cláusula OUTPUT, que copia todos os atributos de todas as linhas excluídas para a variável de tabela @DeletedOrders e, em seguida, usa a instrução INSERT INTO para copiar todas as linhas da variável de tabela para a tabela OrdersArchive:
DECLARE @DeletedOrders TABLE
(
ID do pedido INT,
data do pedido DATETIME,
empidINT,
custid VARCHAR(5),
quantidadeINT
)
ENQUANTO 1=1
COMEÇAR
COMEÇAR TRANS
EXCLUIR TOP(5000) DOS Pedidos
SAÍDA excluída.* EM @DeletedOrders
ONDE data do pedido < '20030101'
INSERIR EM OrdersArchive
SELECIONE * DE @DeletedOrders
COMMIT TRANS
EXCLUIR DE @DeletedOrders
SE @@rowcount <5000
QUEBRAR
END
Outro exemplo é o seguinte. Se houver uma tabela como segue: Criar tabela Employee(EmpID int Identity(1, 1) restrição Employee_pk chave primária, FirstName varchar(100), LastName Varchar(100), Sex char(1), Saudação como caso quando Sexo ='M' então 'Sr.' quando Sexo ='F' então 'Sra.' else '' fim, Salário Dinheiro, Deduções como caso Quando Salário <3000 então 0,20 * Salárioquando Salário entre 30.000 e 50.000 então 0,26* Salário quando Salário entre 50.001 e 75.000 então .30*Salaryelse .35*Final do salário, restrição de data e hora DOJ DOJ_DEF padrão getdate())
} Uma tabela muito simples, em que cláusulas de caso são usadas para definir Saudação, deduções, doj, etc. respectivamente. E podemos criar outro procedimento armazenado, como segue: Criar procedimento empregado_insert@Fname varchar(100),@Lname varchar(100),@sex char(1),@Salary Moneyasdeclare @empoutput table (EmpID int, FirstName varchar(100) , Sobrenome Varchar(100),Sex char(1), Saudação char(3),Salary Money,Deductions Money,DOJ datetime )inserir em Employee(FirstName,LastName,Salary,sex)OUTPUT inserido.* em @empoutputvalues(@Fname ,@Lnome ,@Salário,@sexo )Selecione * em @empoutput
Então, ao chamar o procedimento armazenado, você pode usar USE [MyDatabase] assim
GOexec Employee_insert 'Miho','Yoshikawa','F',146000
Desta forma, os dados serão inseridos na tabela de funcionários durante a execução, e uma variável temporária empoutput será definida. Observe que esta pode ser na forma de tabela. Definido no formulário, é fácil de ver aqui, e os dados inseridos na tabela de funcionários serão enviados para a variável empoutput ao mesmo tempo. Após executarmos este procedimento armazenado, encontraremos os seguintes resultados.
EmpID,Nome,Sobrenome,Sexo,Saudação,Salário,Deduções,DOJ
7, Miho, Yoshikawa, F, Sra., 146000,00,51100,00,2006-04-09 23:16:44.920
, e os registros são realmente inseridos na tabela de funcionários
Você pode ver
a fonte: jackyrong BLOG