sql >> Databáze >  >> RDS >> Sqlserver

Je možné, aby klauzule SQL Output vrátila sloupec, který není vložen?

Můžete to udělat pomocí MERGE místo vložit:

tak vyměňte toto

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

s

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

Klíčem je použití predikátu, který nikdy nebude pravdivý (1 =0) ve vyhledávací podmínce sloučení, takže vložení vždy provedete, ale budete mít přístup k polím ve zdrojové i cílové tabulce.

Zde je celý kód, který jsem použil k testová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 

Více čtení a zdroj všeho, co o tomto tématu vím, je zde



  1. TSQL – Přidat sloupec do všech tabulek v databázi [Příklad kurzoru]

  2. SQL Server uložené procedury od Oracle®

  3. SQL Server rekurzivní dotaz

  4. SQL, kde spojená sada musí obsahovat všechny hodnoty, ale může obsahovat více