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

Có thể để mệnh đề Đầu ra SQL trả về một cột không được chèn vào không?

Bạn có thể thực hiện việc này bằng cách sử dụng MERGE thay vì chèn:

vì vậy hãy thay thế cái này

INSERT INTO ReportOption (field1, field2...)
OUTPUT @ReportOption.PracticeId, --> this is the field I don't know how to get
       inserted.ReportOptionId
  INTO @PracticeReportOption (PracticeId, ReportOptionId)
SELECT field1, field2
  FROM @ReportOption

với

MERGE INTO ReportOption USING @ReportOption AS temp ON 1 = 0
WHEN NOT MATCHED THEN
    INSERT (field1, field2)
    VALUES (temp.Field1, temp.Field2)
    OUTPUT temp.PracticeId, inserted.ReportOptionId, inserted.Field1, inserted.Field2
    INTO @PracticeReportOption (PracticeId, ReportOptionId, Field1, Field2);

Điều quan trọng là sử dụng một vị từ sẽ không bao giờ đúng (1 =0) trong điều kiện tìm kiếm hợp nhất, vì vậy bạn sẽ luôn thực hiện chèn, nhưng có quyền truy cập vào các trường trong cả bảng nguồn và bảng đích.

Đây là toàn bộ mã tôi đã sử dụng để kiểm tra nó:

CREATE TABLE ReportOption (ReportOptionID INT IDENTITY(1, 1), Field1 INT, Field2 INT)
CREATE TABLE Practice (PracticeID INT IDENTITY(1, 1), Field1 INT, Field2 INT)
CREATE TABLE PracticeReportOption (PracticeReportOptionID INT IDENTITY(1, 1), PracticeID INT, ReportOptionID INT, Field1 INT, Field2 INT)

INSERT INTO Practice VALUES (1, 1), (2, 2), (3, 3), (4, 4)


MERGE INTO ReportOption r USING Practice p ON 1 = 0
WHEN NOT MATCHED THEN
    INSERT (field1, field2)
    VALUES (p.Field1, p.Field2)
    OUTPUT p.PracticeId, inserted.ReportOptionId, inserted.Field1, inserted.Field2
    INTO PracticeReportOption (PracticeId, ReportOptionId, Field1, Field2);

SELECT  *
FROM    PracticeReportOption

DROP TABLE ReportOption
DROP TABLE Practice
DROP TABLE PracticeReportOption 

Đọc thêm và nguồn của tất cả những gì tôi biết về chủ đề này là ở đây



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách nhập tệp JSON vào bảng SQL Server

  2. Tại sao SQL Server tự động bỏ qua khoảng trống ở cuối?

  3. Ý nghĩa của 1/1/1753 trong SQL Server là gì?

  4. Kích hoạt SQL Server:Kích hoạt DML

  5. SQL thay thế tất cả các NULL