sql >> Database >  >> RDS >> Sqlserver

Is het mogelijk om voor SQL Output-clausule een kolom te retourneren die niet is ingevoegd?

U kunt dit doen door MERGE . te gebruiken in plaats van invoegen:

dus vervang dit

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

met

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

De sleutel is om een ​​predikaat te gebruiken dat nooit waar zal zijn (1 =0) in de zoekvoorwaarde voor samenvoegen, zodat u altijd de invoeging uitvoert, maar toegang hebt tot velden in zowel de bron- als de doeltabellen.

Hier is de volledige code die ik heb gebruikt om het te testen:

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 

Meer lezen, en de bron van alles wat ik weet over dit onderwerp is hier



  1. Hoe te repareren "Ongeldige objectnaam 'OPENJSON'." in SQL Server

  2. Conversie mislukt bij het converteren van datum en/of tijd van tekenreeks tijdens het invoegen van datetime

  3. MySQL-replicatie met ProxySQL op WHM/cPanel-servers:deel één

  4. Opgeslagen procedure die gegevens naar csv-bestanden exporteert, wordt alleen naar één bestand geëxporteerd