Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Fare riferimento a un'altra colonna nella definizione DEFAULT in SQL Server 2005

Ecco qua, lo sto dimostrando con uno schema di esempio poiché non hai fornito i tuoi veri nomi di tabella/colonna.

Tabella:

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
  ) 

Ecco la definizione del trigger:

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

Fondamentalmente sostituisce qualsiasi istruzione di inserimento eseguita sulla tabella con quella nel trigger, quindi controllo usando il inserted tabella temporanea per vedere se il valore che sta tentando di essere inserito nella nostra colonna opzionale non annullabile, col3 , è zero. Se lo è, lo sostituisco con l'aggiunta di col1 e col2 (Mi sto coalizzando con zero perché non hai menzionato se le due colonne di origine sono nullable o meno).

È quindi possibile eseguire istruzioni di inserimento che lo includono o meno, nonostante col3 non è annullabile:

INSERT INTO test(col1,col2)
SELECT 12, 31
GO

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

I risultati sono:

ID  COL1 COL2 COL3
------------------  
1   12   31    43
2   1    2     89

Se il trigger non era presente, potresti aver ricevuto un errore durante il tentativo di eseguire la prima istruzione di inserimento, dicendoti che non poteva inserire NULL in col3 .

Si noti inoltre che la seconda istruzione di inserimento che specifica un valore non è stata sostituita dall'addizione, come richiesto.

Ecco un SQL Fiddle funzionante .