Ich habe Code ähnlich dem folgenden in einer gespeicherten Prozedur, die eine Zeile in eine Tabelle einfügt, möchte ich die letzte Spalte (FieldD) zu @prmSomeValue festlegen, es sei denn es ist Null, andernfalls verwenden Sie einfach den Standardwert definiert für diese Spalte.Gibt es eine Möglichkeit, Standardspaltenwerte in einer INSERT..SELECT-Anweisung bedingt zu verwenden?
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 verletzt das DRY-Prinzip. Ich versuche, einen Weg zu finden, dies mit einer einzigen Insert-Anweisung zu tun. Etwas in der Art des folgenden Pseudocodes.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
FROM MyOtherTable
Wer hat irgendwelche Ideen?
Update - Eine weitere Wendung
Die Standardeinschränkung ist keine wörtliche Wert, sondern eine Funktion, wie unten gezeigt.
...DEFAULT (suser_sname()) FOR [FieldD]
aktualisieren
ich das kleinere Übel schließlich punted und wählte und nur den Standardwert Funktion in meine Abfrage anstatt zu fallen bis zum für die Spalte konfigurierten Standard kopiert. Ich mag es nicht, aber es macht den Job mit weniger Wiederholungen in meiner Frage erledigt.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
FROM MyOtherTable
Interessante Idee. Ich bin mir nicht sicher, ob es besser ist, aber auf jeden Fall eine Bewertung wert. – JohnFx
Dank JohnFx, ich denke, es könnte vorzuziehen sein, wenn es mehr als eine optionale Spalte gibt, die auf diese Weise behandelt werden soll. Dann können Sie sagen "WENN @foo IST NICHT NULL ODER @ bar IST NICHT NULL, UPDATE SET foo = COALESCE (@ foo, foo), bar = COALESCE (@ bar, bar) WHERE" etc., anstatt eine insert-Anweisung zu schreiben für jede mögliche Kombination. –
Verwenden Sie ISNULL anstelle von COALESCE, COALESCE ist für mehrere Argumente vorgesehen. Ich würde nicht für Feld = Parameter/Feld Ansätze gehen, es tötet SQL-Performance, macht es schwieriger, Abfragen und die Verwendung von Indizes zu optimieren. Eine einfache if-Anweisung wäre weitaus effizienter. – Zyphrax