sql >> データベース >  >> RDS >> Sqlserver

SQL出力句が挿入されていない列を返すことは可能ですか?

    これは、MERGEを使用して行うことができます 挿入の代わりに:

    だからこれを交換してください

    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
    

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

    重要なのは、マージ検索条件で真になることのない述語(1 =0)を使用することです。そのため、常に挿入を実行しますが、ソーステーブルと宛先テーブルの両方のフィールドにアクセスできます。

    これが私がそれをテストするために使用したコード全体です:

    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 
    

    もっと読んで、この主題に関して私が知っているすべての情報源はここにあります



    1. K-PostGISの最近傍クエリ

    2. PostgreSQLの根性:「resjunk」とは何ですか?

    3. SQLを使用して型時間の合計を計算する

    4. SQLServerでBETWEEN演算子を使用する方法