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

Czy jest możliwe, aby klauzula SQL Output zwróciła kolumnę, która nie jest wstawiana?

Możesz to zrobić za pomocą MERGE zamiast wstawić:

więc zastąp to

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

z

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);

Kluczem jest użycie predykatu, który nigdy nie będzie prawdziwy (1 =0) w warunku wyszukiwania scalającego, więc zawsze będziesz wykonywać wstawianie, ale masz dostęp do pól zarówno w tabeli źródłowej, jak i docelowej.

Oto cały kod, którego użyłem do przetestowania:

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

Więcej czytania i źródło wszystkiego, co wiem na ten temat, jest tutaj



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JPA SQL Server bez mapowania dialektu dla typu JDBC:-9

  2. Konwertuj „datetimeoffset” na „time” w SQL Server (przykłady T-SQL)

  3. czy istnieje przewaga varchar(500) nad varchar(8000)?

  4. Operacja nie obowiązuje dla stanu błędu transakcji i zakresu transakcji

  5. Zapytanie o liczbę rekordów w każdej tabeli w bazie danych