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

OUTPUTinserted.idを選択した行の値と組み合わせます

    MERGEを(乱用)使用できます OUTPUTを使用 条項。

    MERGE INSERTできます 、UPDATE およびDELETE 行。この場合、INSERTするだけで済みます .1 =0は常にfalseであるため、NOT MATCHED BY TARGET 一部は常に実行されます。通常、他のブランチが存在する可能性があります。ドキュメントを参照してください。WHEN MATCHED 通常、UPDATEに使用されます;WHEN NOT MATCHED BY SOURCE 通常、DELETEに使用されます 、ただし、ここでは必要ありません。

    この複雑な形式のMERGE 単純なINSERTと同等です 、ただし、単純なINSERTとは異なります そのOUTPUT 句を使用すると、必要な列を参照できます。ソーステーブルと宛先テーブルの両方から列を取得できるため、古いIDと新しいIDの間のマッピングを保存できます。

    MERGE INTO [dbo].[Test]
    USING
    (
        SELECT [Data]
        FROM @Old AS O
    ) AS Src
    ON 1 = 0
    WHEN NOT MATCHED BY TARGET THEN
    INSERT ([Data])
    VALUES (Src.[Data])
    OUTPUT Src.ID AS OldID, inserted.ID AS NewID
    INTO @New(ID, [OtherID])
    ;
    

    更新について、生成されたIDENTITYの順序に依存する 値。

    単純なケースでは、[dbo].[Test]の場合 IDENTITYがあります 列、次にINSERT ORDER BYを使用 します 生成されたIDENTITYを保証します 値は指定された順序になります。 SQLServerでの注文保証 。挿入された行の物理的な順序は保証されませんが、IDENTITYの順序は保証されます。 値が生成されます。

    INSERT INTO [dbo].[Test] ([Data])
    SELECT [Data]
    FROM @Old
    ORDER BY [RowID]
    

    ただし、OUTPUTを使用する場合 条項:

    INSERT INTO [dbo].[Test] ([Data])
    OUTPUT inserted.[ID] INTO @New
    SELECT [Data]
    FROM @Old
    ORDER BY [RowID]
    

    OUTPUTの行 ストリームは注文されていません。少なくとも、厳密に言えば、ORDER BY クエリでは、プライマリINSERTに適用されます 操作が、OUTPUTの順序を示すものは何もありません 。だから、私はそれに頼ろうとはしません。 MERGEを使用する または、ID間のマッピングを明示的に保存する列を追加します。



    1. .netコアプロジェクトのSignalRCoreでpostgresqlデータベースをリッスンするにはどうすればよいですか?

    2. postgresで特定のスキーマのすべてのテーブルを削除するにはどうすればよいですか?

    3. SQL構文エラー-エラーが見つかりません

    4. PostgreSQL:postgreSQLデータベースに格納できるテーブルの最大数はいくつですか?