Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Référencer une autre colonne dans la définition DEFAULT dans SQL Server 2005

Voilà, je le démontre avec un exemple de schéma puisque vous n'avez pas fourni vos vrais noms de table/colonne.

Tableau :

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
  ) 

Voici la définition du déclencheur :

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

Fondamentalement, il remplace toute instruction d'insertion effectuée sur la table par celle du déclencheur, donc je vérifie en utilisant le inserted table temporaire pour voir si la valeur qui tente d'être insérée dans notre colonne facultative non nulle, col3 , est NUL. Si c'est le cas, je le remplace par l'ajout de col1 et col2 (Je fusionne avec zéro car vous n'avez pas mentionné si les deux colonnes source sont nullables ou non).

Vous pouvez ensuite exécuter des instructions d'insertion qui l'incluent ou non, malgré le fait col3 n'est pas nullable :

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

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

Les résultats sont :

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

Si le déclencheur n'était pas là, vous pourriez avoir une erreur en essayant d'exécuter cette première instruction d'insertion, vous indiquant qu'il ne pouvait pas insérer NULL dans col3 .

Notez également que la deuxième instruction d'insertion qui spécifie une valeur n'a pas été remplacée par l'addition, comme demandé.

Voici un SQL Fiddle .