Gibt es eine Möglichkeit, bedingt Standardspaltenwerte in einer INSERT-Anweisung verwenden?
-
23-09-2019 - |
Frage
Ich habe Code ähnlich dem folgenden in einer gespeicherten Prozedur bekam, dass Einsätze eine Zeile in eine Tabelle, würde Ich mag die letzte Spalte (FieldD) zu @prmSomeValue einzustellen, wenn es null ist, sonst nur den Standardwert verwenden für diese Spalte definiert.
IF (@prmSomeValue IS NULL)
INSERT INTO MyTable (fieldA,FieldB,FieldC)
SELECT A,B,C
FROM MyOtherTable
ELSE
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,@prmSomeValue
FROM MyOtherTable
Dies funktioniert, aber verstößt gegen das DRY-Prinzip. Ich versuche, einen Weg zu finden, diese mit einer einzigen Insert-Anweisung zu tun. Etwas nach dem Vorbild des folgenden Pseudo-Code.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
FROM MyOtherTable
Wer irgendwelche Ideen?
Update - Eine weitere Wendung
Die Standardeinschränkung ist keine wörtliche Wert, sondern eine Funktion, wie unten dargestellt.
...DEFAULT (suser_sname()) FOR [FieldD]
Aktualisieren
Ich endlich punted und das kleinere Übel gewählt haben und nur den Standardwert Funktion in meine Abfrage anstatt zu fallen bis zum für die Spalte konfigurierten Standard kopiert. Ich liebe es nicht, aber es wird die Arbeit mit weniger Wiederholungen geschehen in meiner Anfrage.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
FROM MyOtherTable
Lösung
Da im Wesentlichen das ist, was SQL Server tut, Sie so etwas zu vermeiden, zumindest zwei nahezu identische Aussagen (Pseudo-Code) tun könnte:
INSERT (columnA,B,C) ... ;
IF @prmSomeValue IS NOT NULL
UPDATE ... ;
Ich glaube nicht, gibt es eine Möglichkeit, um COALESCE mit dem Standardwert.
Andere Tipps
Ich würde sagen, dass Ihre Methode in Ordnung ist. Ein einfacher Test, gefolgt von einem Einsatz. Wenn Sie sich über DRY besorgt sind, kapselt den Anruf, so dass es immer wieder aufgerufen werden.
Ich würde sagen, dass Einsätze / Updates auf einem db auf einigen Tischen kostspielig sein können (abhängig von dem Design-Ziel) so, wenn Sie zusätzlichen Code schreiben müssen, um dieses Szenario zu behandeln dann sehe ich kein Problem mit dem Handel aus.
Das Macht Arbeit, hängt davon ab, wenn Sie den Standardwert in einer Standardeinschränkung definiert bedeuten, oder in Code? Wenn „Zwang“ es gelingt nicht, wenn „Code“ es funktioniert. Bearbeiten : Sie meinen Zwang. doh!
SELECT A,B,C,@prmSomeValue
FROM MyOtherTable
WHERE @prmSomeValue IS NOT NULL
UNION ALL
SELECT A,B,C,DEFAULT
FROM MyOtherTable
WHERE @prmSomeValue IS NULL
Was auch immer Art und Weise wollen Sie es tun, eine Spalte in der INSERT-Klausel zur Angabe erfordert einen Wert.
So Ihre erste Lösung ist, was Sie haben zu tun ...
So etwas wie diese funktionieren könnte (tho nicht sehr hübsch):
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,
case when @prmSomeValue is null
then
(SELECT text FROM syscomments WHERE id IN (SELECT cdefault FROM syscolumns
WHERE id = object_id('MyTable') AND cdefault > 0))
else @prmSomeValue
end
FROM MyOtherTable