Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verweis auf eine andere Spalte in der DEFAULT-Definition in SQL Server 2005

Bitte schön, ich demonstriere dies mit einem Beispielschema, da Sie Ihre echten Tabellen-/Spaltennamen nicht angegeben haben.

Tabelle:

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
  ) 

Hier ist die Trigger-Definition:

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

Grundsätzlich ersetzt es jede Insert-Anweisung, die in der Tabelle ausgeführt wird, durch die im Trigger, also überprüfe ich mit dem inserted temporäre Tabelle, um zu sehen, ob der Wert, der versucht, in unsere optionale Spalte ohne Nullwerte eingefügt zu werden, col3 , ist Null. Wenn ja, ersetze ich es durch den Zusatz col1 und col2 (Ich verschmelze mit Null, da Sie nicht erwähnt haben, ob die beiden Quellspalten nullable sind oder nicht).

Sie können dann Einfügeanweisungen ausführen, die es entweder enthalten oder nicht, trotz col3 ist nicht nullable:

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

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

Ergebnisse sind:

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

Wenn der Trigger nicht vorhanden war, könnten Sie beim Versuch, diese erste Einfügungsanweisung auszuführen, einen Fehler erhalten haben, der Ihnen mitteilt, dass NULL nicht in col3 eingefügt werden konnte .

Beachten Sie auch, dass die zweite Insert-Anweisung, die einen Wert angibt, nicht wie gewünscht durch den Zusatz ersetzt wurde.

Hier ist eine funktionierende SQL Fiddle .