Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Fazendo referência a outra coluna na definição DEFAULT no SQL Server 2005


Aqui está, estou demonstrando isso com um esquema de exemplo, pois você não forneceu seus nomes reais de tabela/coluna.

Mesa:
CREATE TABLE test
  (
     id   INT NOT NULL PRIMARY KEY IDENTITY, --made up key
     col1 INT, --first column to add, wasn't sure if this was nullable or not
     col2 INT, --second column to add, wasn't sure if this was nullable or not
     col3 INT NOT NULL --this is the column to optionally insert into
  ) 

Aqui está a definição do gatilho:
CREATE TRIGGER demo
ON test
INSTEAD OF INSERT
AS
    INSERT INTO test (col1,col2,col3)
    SELECT inserted.col1,
           inserted.col2,
           CASE
             WHEN inserted.col3 IS NULL THEN COALESCE(inserted.col1, 0) + COALESCE(inserted.col2, 0)
             ELSE inserted.col3
           END
    FROM   inserted

Basicamente, ele substitui qualquer instrução de inserção feita na tabela com a do gatilho, então eu verifico usando o inserted tabela temporária para ver se o valor que está tentando ser inserido em nossa coluna opcional não anulável, col3 , é nulo. Se for, eu o substituo pela adição de col1 e col2 (Estou unindo com zero, pois você não mencionou se as duas colunas de origem são anuláveis ​​ou não).

Você pode então executar instruções de inserção que incluem ou não, apesar do fato de col3 não é anulável:
INSERT INTO test(col1,col2)
SELECT 12, 31
GO

INSERT INTO test(col1, col2, col3)
SELECT 1, 2, 89
GO

Os resultados são:
ID  COL1 COL2 COL3
------------------  
1   12   31    43
2   1    2     89

Se o gatilho não estivesse lá, você poderia ter recebido um erro ao tentar executar a primeira instrução de inserção, informando que não foi possível inserir NULL em col3 .

Observe também que a segunda instrução de inserção que especifica um valor não foi substituída pela adição, conforme solicitado.

Aqui está um SQL Fiddle em funcionamento .