Articles

A cláusula de saída para as declarações de actualização

a cláusula de saída foi introduzida na versão do SQL Server 2005. A cláusula de saída devolve os valores de cada linha que foi afectada por uma declaração de inserção, actualização ou supressão. Ele ainda suporta a instrução MERGE, que foi introduzida no SQL Server 2008. O resultado da cláusula de saída pode ser inserido em uma tabela separada durante a execução da consulta. Esta cláusula é mais frequentemente utilizada para efeitos de auditoria. Usando este alguém pode implementar um processo personalizado que funcionaria como CDC, ou agir da mesma forma que CDC.

além disso, os resultados da cláusula de saída podem ser devolvidos às aplicações de processamento para uso em coisas como mensagens de confirmação, registro e quaisquer outros requisitos de Aplicação. Neste artigo, vou fornecer um conjunto de exemplos para mostrar o uso da cláusula de saída na captura dos resultados das linhas atualizadas em uma variável de tabela para as declarações de atualização.

iniciando

a fim de seguir os exemplos abaixo, você terá que criar uma tabela Department_SRC executando o código T-SQL abaixo em uma base de dados do servidor SQL. A secção referenciada contém dados avançados.SQL file, que inclui o código T-SQL para experimentar os exemplos abaixo.

IF OBJECT_ID ('Department_SRC', 'U') IS NOT NULL DROP TABLE dbo.Department_SRC;CREATE TABLE .( IDENTITY(1,1) NOT NULL, varchar(50) NOT NULL, varchar(50) NOT NULL, NOT NULL) ON Insert into .(,,) Values('Engineering','Research and Development',getdate());

pode ver na tabela dados que o registo foi inserido na tabela como mostrado na imagem abaixo.

Implementar a Cláusula OUTPUT em Instruções Update

Como discutimos no meu artigo anterior, a cláusula OUTPUT dá acesso a duas tabelas virtuais (Magia Tabelas):

  1. “INSERIDO” contém novas linhas (INSERT ou UPDATE SET)
  2. “EXCLUÍDOS” contém a cópia antiga de linhas(ATUALIZAÇÃO do CONJUNTO)

A cláusula OUTPUT em uma instrução UPDATE terá acesso a ambas INSERIDAS e EXCLUÍDAS tabelas internas. Isso significa que ambas as tabelas estão acessíveis ao mesmo tempo de executar a declaração de atualização. Por exemplo, suponha que estamos atualizando algumas colunas em uma tabela para uma única linha. Os valores recentemente atualizados são as mudanças na tabela e estão na tabela interna inserida. Além disso, os dados que foram alterados são os antigos valores dos dados e são inseridos na tabela interna apagada.

visualizando os valores de atualização

Usando a cláusula de saída, podemos mostrar os valores atualizados na janela de saída, selecionando os nomes das colunas com o prefixo inserido ou usando inserido.* para mostrar todas as colunas da tabela inserida. Além disso, podemos exibir os valores de dados antigos da tabela para a janela de saída, selecionando os nomes das colunas com prefixo deletado ou usando deletado.* para exibir todas as colunas dessa tabela. Isto também ajudará na impressão de algumas das mensagens de saída na janela do estúdio de gestão.

A fim de explicar isso com um exemplo, estou executando o código abaixo, no qual estamos tentando atualizar a coluna do nome de grupo do valor “pesquisa e desenvolvimento” para o valor “IT” para o departamento de “Engenharia”.

Uma vez que executamos o código acima, podemos ver o resultado da cláusula de saída como mostrado na imagem abaixo.

inserindo os resultados da saída numa variável da tabela

a fim de mostrar este exemplo, declarei uma variável da tabela chamada @Updated para guardar os resultados da cláusula de saída nesta variável da tabela. Usamos a saída em sintaxe, a fim de armazenar os resultados em uma variável de tabela. Nesta abordagem, temos acesso a definir linhas tanto os novos valores como os valores antigos que foram atualizados pela consulta, que podem ser usados para os próximos passos no mesmo lote.

--capturing Updated values using table variable.DECLARE @Updated table( int, varchar(50), varchar(50), varchar(50), datetime, datetime);Update Set ='IT', ModifiedDate=Getdate()OUTPUT deleted.DepartmentID, deleted.Name, deleted.GroupName as GroupName_old, inserted.GroupName as GroupName_new, deleted.ModifiedDate as ModifiedDate_old,inserted.ModifiedDate as ModifiedDate_newINTO @UpdatedWhere ='Engineering'--Querying from @Updated output tableSelect * from @Updated

Uma vez que executamos o código acima, podemos ver que os resultados foram inseridos na variável de tabela @Updated como mostrado na imagem abaixo.

Utilização da cláusula de saída para carregar uma dimensão do tipo 3 em mudança lenta

com os exemplos acima apresentados, a cláusula de saída é uma alternativa muito boa para carregar uma tabela de dimensão do tipo 3. Para explicar isso com um exemplo, estou executando o código abaixo, que irá criar uma tabela de dimensão tipo 3 chamada Department_Type3.

---Type 3 table exampleIF OBJECT_ID ('Department_Type3', 'U') IS NOT NULL DROP TABLE dbo.Department_Type3;CREATE TABLE .( IDENTITY(1,1) NOT NULL, varchar(50) NULL, varchar(50) NULL, varchar(50) NULL, NULL) ON GO---Insert some test valuesInsert into .(,,) Values('Engineering','Research and Development',getdate());Select * from .

Uma vez que executamos o código acima, podemos ver o resultado dos dados da tabela como mostrado abaixo imagem.

À medida que estamos a inserir um novo registo na tabela Department_Type3, podemos ver que a coluna GroupName_old tem um valor nulo e Groupname_corrent tem o valor da inserção recente. Vamos assumir que houve mudança no Groupname_corrent para o nome do Departamento de “engenharia” e precisamos atualizar a tabela Department_Type3 com o novo valor Groupname_corrent. Uma vez que isto é, uma tabela de dimensão TYPE3, o requisito aqui é atualizar a coluna GroupName_old com “pesquisa e desenvolvimento” e Groupname_corrent com o novo valor.

--capturing Updated values using table variable.DECLARE @Updated table( int, varchar(50), varchar(50), varchar(50), datetime, datetime);Update Set ='IT', EffectiveDate=Getdate()OUTPUT deleted.DepartmentID, deleted.Name, deleted. as ,inserted.GroupName_current as GroupName_new, deleted.EffectiveDate as ModifiedDate_old,inserted.EffectiveDate as ModifiedDate_newINTO @UpdatedWhere ='Engineering'--Update the GroupName_old with old valuesUpdate aSet a.GroupName_old=b.GroupName_old, a.EffectiveDate=b.ModifiedDate_newfrom as ainner join @Updated as bon a.DepartmentID=b.DepartmentID--Querying the final tableSelect * from 

Uma vez que executarmos o código acima, iremos capturar os resultados da tabela interna apagada para a variável da tabela @Updated e, em seguida, usando esses dados para atualizar as colunas da tabela final para implementar este tipo 3, mudando lentamente a dimensão. Podemos ver o resultado dos dados finais da tabela antes e depois da execução da declaração acima, como mostrado nas imagens abaixo.

Antes de a ATUALIZAÇÃO da execução da instrução

Após a ATUALIZAÇÃO da execução da instrução

SAÍDA Cláusula Limitações

Alguns dos cenários em que a cláusula OUTPUT não é suportada:

  1. instruções DML que fazem referência a modos de exibição particionados locais, modos de exibição particionados distribuídos, ou tabelas remotas.
  2. inserir declarações que contenham uma declaração de execução.
  3. predicados de texto completo não são permitidos na cláusula de saída quando o nível de compatibilidade da base de dados é definido para 100.
  4. o resultado na cláusula não pode ser usado para inserir numa vista, ou na função rowset.
  5. uma função definida pelo Utilizador não pode ser criada se contiver uma saída numa cláusula que tenha uma tabela como alvo

a lista completa está listada nesta ligação: https://technet.microsoft.com/en-us/library/ms177564(v=sql.110).aspx

Resumo

Como mostrado nos exemplos acima, podemos ver que a cláusula OUTPUT é fácil de usar e pode evitar muita codificação personalizada, a fim de capturar os resultados de saída de valores atualizados com os antigos e novos valores em uma variável de tabela durante a execução da consulta.