2016-11-03 4 views
0

値のリストを特定のテーブルの行として表現したい。現在、私のコードは、アップサートの一環として、次のようになります。テーブル定義としての値のキャストリスト

MERGE INTO dbo.MyTable mt 
    USING (VALUES(1234, 'Val1', GETDATE())) 
     AS v(ID, Value, DateUpdated) 
    ON v.ID = mt.ID 
    WHEN NOT MATCHED THEN 
    INSERT VALUES(v.ID, v.Value, v.DateUpdated) 
    WHEN MATCHED THEN 
    UPDATE SET mt.Value = v.Value; 

理想的には私のコードは、より次のようになります。

「typeof演算は、」私のテーブルの定義は、両方に使用することができます
MERGE INTO dbo.MyTable mt 
    USING (VALUES(1234, 'Val1', GETDATE())) 
     AS v(typeof(dbo.MyTable)) --TABLE DEFINITION, NO DUPLICATE TYPING 
    ON v.ID = mt.ID 
    WHEN NOT MATCHED THEN 
    INSERT VALUES(v.ID, v.Value, v.DateUpdated) 
    WHEN MATCHED THEN 
    UPDATE SET mt.Value = v.Value; 

値の型キャストと名前のキャスト

+1

、これを試してみてください?表のコンストラクタ内の列のリストの表名を置き換えることはできません。それはどのように動作するのではありません。 –

+0

これはPostgresのような他のデータベースでも機能し、値のリストをテーブル "タイプ"にキャストできます。 – danjuggler

+0

あなたが何を求めているのかは不明です。具体的には、1) '%'演算子の意図がわからない(ISO SQLでもTでも有効ではないため)、なぜAS v(dbo.MyTable%ROWTYPE) -SQL)、2)SQLには行タイプ、表にはそれぞれ1種類の行しかありません.3)この節で指定されているのは、行タイプでもテーブルでもない列セットです。以前に指定された表の列のサブセット – RBarryYoung

答えて

1

は、あなたが「テーブル定義、NO DUPLICATEタイピング」

を探している理由がわからないし、私が正しくあなたの条件を理解しているかどうかはわかりません。

は、ハァッ....一言で

MERGE INTO dbo.MyTable mt 
    USING (select ID, Value, DateUpdated from dbo.MyTable%ROWTYPE where id=-1 
     union all 
     select 1234,'Val1',GETDATE() 
     ) AS v 
    ON v.ID = mt.ID 
    WHEN NOT MATCHED THEN 
    INSERT VALUES(v.ID, v.Value, v.DateUpdated) 
    WHEN MATCHED THEN 
    UPDATE SET mt.Value = v.Value; 
関連する問題