Tôi đã có mã tương tự như sau trong một thủ tục được lưu trữ chèn một hàng vào một bảng, tôi muốn đặt cột cuối cùng (FieldD) thành @prmSomeValue trừ khi nó là null, nếu không chỉ sử dụng giá trị mặc định được xác định cho cột đó.Có cách nào để có điều kiện sử dụng giá trị cột mặc định trong câu lệnh INSERT..SELECT không?
IF (@prmSomeValue IS NULL)
INSERT INTO MyTable (fieldA,FieldB,FieldC)
SELECT A,B,C
FROM MyOtherTable
ELSE
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,@prmSomeValue
FROM MyOtherTable
Tác phẩm này, nhưng vi phạm nguyên tắc DRY. Tôi đang cố gắng tìm một số cách để làm điều này với một tuyên bố chèn đơn. Một cái gì đó dọc theo dòng của mã giả sau đây.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
FROM MyOtherTable
Bất kỳ ai có ý tưởng?
Cập nhật - Một bước nữa
Ràng buộc mặc định không phải là giá trị bằng chữ, nhưng có chức năng như được hiển thị bên dưới.
...DEFAULT (suser_sname()) FOR [FieldD]
Cập nhật
Cuối cùng tôi punted và chọn ít tệ nạn và chỉ cần sao chép hàm giá trị mặc định vào truy vấn của tôi thay vì rơi xuống thông qua các cấu hình mặc định cho cột. Tôi không thích nó, nhưng nó được thực hiện công việc với sự lặp lại ít hơn trong truy vấn của tôi.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
FROM MyOtherTable
Ý tưởng thú vị. Không chắc chắn nếu nó là thích hợp hơn, nhưng chắc chắn giá trị một cuộc bỏ phiếu. – JohnFx
Cảm ơn JohnFx, tôi nghĩ rằng nó có thể là thích hợp hơn khi có nhiều hơn một cột tùy chọn được xử lý theo cách này. Sau đó, bạn có thể nói "IF @foo IS NOT NULL HOẶC @bar IS NOT NULL, CẬP NHẬT SET foo = COALESCE (@foo, foo), bar = COALESCE (@bar, bar) WHERE" vv, thay vì viết câu lệnh chèn cho mọi kết hợp có thể. –
Sử dụng ISNULL thay vì COALESCE, COALESCE dành cho nhiều đối số. Tôi sẽ không đi theo các phương thức field = parameter/field, nó sẽ giết hiệu năng SQL, làm cho việc tối ưu hóa các truy vấn và sử dụng các chỉ mục khó khăn hơn. Một câu lệnh if đơn giản sẽ hiệu quả hơn nhiều. – Zyphrax