2016-11-03 4 views
0

Ich möchte eine Liste von Werten als eine Zeile einer bestimmten Tabelle darstellen. Derzeit sieht mein Code wie diesen als Teil eines Upsert:Cast Werteliste als Tabellendefinition

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; 

Idealerweise würde mein Code aussehen wie folgt aus:

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; 

Wo „typeof“ die Definition meiner Tabelle ermöglicht für beide verwendet werden Werttyp Casting und Namenscasting.

+1

In einem Wort .... oder? Sie können nicht einfach einen Tabellennamen für eine Liste von Spalten in einem Tabellenkonstruktor ersetzen. So funktioniert das nicht. –

+0

Dies funktioniert in anderen Datenbanken wie Postgres, Sie können eine Liste von Werten in eine Tabelle "Typ" umwandeln. – danjuggler

+0

Es ist unklar, was Sie fragen. Insbesondere ist unklar, was 'AS v (dbo.MyTable% ROWTYPE)' bedeuten soll, weil 1) wir nicht wissen, was Sie mit dem '%' -Operator machen wollen (weder in ISO SQL noch in T -SQL), 2) Es gibt keinen Zeilentyp in SQL, Tabellen haben nur jeweils einen Typ von Zeile und 3) Was in dieser Klausel angegeben wird, ist weder ein Rottyp noch eine Tabelle, es ist ein Spaltensatz, der sein muss eine Teilmenge der Spalten der zuvor angegebenen Tabelle. – RBarryYoung

Antwort

1

Sie wissen nicht, warum Sie sich für „TABLE DEFINITION, NO DUPLICATE TYPING“ suchen

Und ich weiß nicht, ob ich Ihre Anforderung richtig verstanden habe.

Try this,

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; 
Verwandte Themen