sql >> Databasteknik >  >> RDS >> Sqlserver

Refererar till en annan kolumn i DEFAULT-definitionen i SQL Server 2005

Varsågod, jag visar detta med ett exempelschema eftersom du inte har angett dina riktiga tabell-/kolumnnamn.

Tabell:

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
  ) 

Här är triggerdefinitionen:

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

Det ersätter i princip alla insert-satser som gjorts på bordet med den i triggern, så jag kontrollerar med inserted temporär tabell för att se om värdet som försöker infogas i vår icke-nullbara valfria kolumn, col3 , är inget. Om det är det, ersätter jag det med tillägget av col1 och col2 (Jag sammansmälter med noll eftersom du inte nämnde om de två källkolumnerna är nullbara eller inte).

Du kan sedan köra insert-satser som antingen inkluderar det eller inte, trots faktumet col3 är inte nullbar:

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

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

Resultaten är:

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

Om triggern inte fanns där kan du ha fått ett felmeddelande när du försökte köra den första insert-satsen, som talar om för dig att den inte kunde infoga NULL i col3 .

Observera också att den andra infogningssatsen som anger ett värde inte har ersatts av tillägget som begärts.

Här är en fungerande SQL-fiol .




  1. Hur bestämmer man databastyp för en given JDBC-anslutning?

  2. Hur kan man skriva frågor i MySQL som kan analysera JSON-data i en kolumn?

  3. Kan vi avbryta förfrågan som skickats till sql-servern?

  4. Vad motsvarar Oracles REF CURSOR i MySQL?