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
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top