Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tham chiếu đến một cột khác trong định nghĩa DEFAULT trong SQL Server 2005

Đây là kết quả của bạn, tôi đang chứng minh điều này bằng một lược đồ mẫu vì bạn chưa cung cấp tên bảng / cột thực của mình.

Bảng:

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
  ) 

Đây là định nghĩa về trình kích hoạt:

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

Về cơ bản, nó thay thế bất kỳ câu lệnh chèn nào được thực hiện trên bảng bằng câu lệnh trong trình kích hoạt, vì vậy tôi kiểm tra bằng cách sử dụng inserted bảng tạm thời để xem liệu giá trị đang cố gắng chèn vào cột tùy chọn không thể nullable của chúng tôi, col3 , là NULL. Nếu có, tôi thay thế nó bằng việc bổ sung col1col2 (Tôi đang kết hợp với số 0 như bạn đã không đề cập đến liệu hai cột nguồn có thể rỗng hay không).

Sau đó, bạn có thể chạy các câu lệnh chèn có bao gồm nó hoặc không, mặc dù thực tế là col3 không thể nullable:

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

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

Kết quả là:

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

Nếu trình kích hoạt không có ở đó, bạn có thể đã gặp lỗi khi cố chạy câu lệnh chèn đầu tiên đó, cho bạn biết rằng nó không thể chèn NULL vào col3 .

Cũng lưu ý rằng câu lệnh chèn thứ hai chỉ định một giá trị không được thay thế bằng phần bổ sung, như được yêu cầu.

Đây là SQL Fiddle đang hoạt động .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi ‘datetime2’ thành ‘datetimeoffset’ trong SQL Server (Ví dụ T-SQL)

  2. Thêm một cột vào tất cả các bảng người dùng trong t-sql

  3. TSQL:Thử bắt giao dịch trong trình kích hoạt

  4. Cách bỏ qua các khoảng trùng lặp trong truy vấn sau để có được thời gian theo dõi chính xác mỗi ngày

  5. Làm cách nào để lấy id được chèn lần cuối?