Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Odwoływanie się do innej kolumny w definicji DEFAULT w SQL Server 2005

Proszę bardzo, pokazuję to za pomocą przykładowego schematu, ponieważ nie podałeś swoich prawdziwych nazw tabel/kolumn.

Tabela:

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
  ) 

Oto definicja wyzwalacza:

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

Zasadniczo zastępuje każdą instrukcję INSERT wykonaną w tabeli tą w wyzwalaczu, więc sprawdzam za pomocą inserted tabela tymczasowa, aby sprawdzić, czy wartość, która próbuje zostać wstawiona do naszej opcjonalnej kolumny niepodlegającej wartości null, col3 , jest NULL. Jeśli tak, zastępuję go dodaniem col1 i col2 (Łączę się z zerem, ponieważ nie wspomniałeś, czy dwie kolumny źródłowe mają wartość null, czy nie).

Następnie możesz uruchomić instrukcje insert, które albo je zawierają, albo nie, pomimo faktu, że col3 nie jest nullable:

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

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

Wyniki to:

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

Jeśli wyzwalacza nie było, mógł wystąpić błąd podczas próby uruchomienia pierwszej instrukcji insert, informujący, że nie można wstawić wartości NULL do col3 .

Zauważ również, że druga instrukcja INSERT, która określa wartość, nie została zastąpiona przez dodanie, zgodnie z żądaniem.

Oto działający SQL Fiddle .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ustawić początkowy rozmiar pliku bazy danych i wzrost plików w projekcie bazy danych?

  2. Zmiana właściwości połączonego serwera w SQL Server

  3. Czy posiadanie „LUB” w warunku INNER JOIN to zły pomysł?

  4. Gdzie wyzwalacz serwera zapisuje w programie SQL Server?

  5. Łączenie ciągów SQL Server z wartością Null