sql >> Databasteknik >  >> RDS >> Sqlserver

Är det möjligt för SQL Output-sats att returnera en kolumn som inte infogas?

Du kan göra detta genom att använda MERGE istället för att infoga:

så byt ut detta

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

med

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

Nyckeln är att använda ett predikat som aldrig kommer att vara sant (1 =0) i sammanslagningssökningsvillkoret, så du kommer alltid att utföra infogningen, men har tillgång till fält i både käll- och destinationstabellerna.

Här är hela koden jag använde för att testa den:

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 

Mer läsning, och källan till allt jag vet om ämnet är här



  1. Anslutning misslyckades:Åtkomst nekad för användaren 'root'@'localhost' (med lösenord:JA) från php-funktionen

  2. Hur kan jag ansluta till en extern databas från en SQL-sats eller en lagrad procedur?

  3. Kapslade loopar och Performance Spools

  4. AVG() Funktion i MariaDB