sql >> Database >  >> RDS >> Sqlserver

Verwijzen naar een andere kolom in DEFAULT-definitie in SQL Server 2005

Alsjeblieft, ik demonstreer dit met een voorbeeldschema, aangezien je je echte tabel-/kolomnamen niet hebt opgegeven.

Tabel:

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 is de triggerdefinitie:

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

In principe vervangt het elke insert-instructie die op de tafel wordt gedaan door die in de trigger, dus ik controleer met behulp van de inserted tijdelijke tabel om te zien of de waarde die probeert in te voegen in onze niet-nullable optionele kolom, col3 , is niets. Als dat zo is, vervang ik het door de toevoeging van col1 en col2 (Ik voeg nul samen omdat je niet vermeldde of de twee bronkolommen nullable zijn of niet).

U kunt dan insert-instructies uitvoeren die het al dan niet bevatten, ondanks het feit dat col3 is niet nullable:

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

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

Resultaten zijn:

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

Als de trigger er niet was, zou je een foutmelding kunnen krijgen bij het uitvoeren van die eerste insert-instructie, die je vertelt dat het geen NULL in col3 kon invoegen .

Merk ook op dat de tweede insert-instructie die een waarde specificeert niet is vervangen door de toevoeging, zoals gevraagd.

Hier is een werkende SQL Fiddle .




  1. SQL-scripts uitvoeren vanuit een pl sql-procedure

  2. De beste manier om de eerste en laatste dag van vorige maand te krijgen?

  3. Kan een CONTAINS- of FREETEXT-predikaat niet gebruiken voor een tabel of geïndexeerde weergave omdat deze niet in volledige tekst is geïndexeerd

  4. MySql:beperk updatetoestemming voor één kolom in één tabel