Mam kod podobny do następującego w procedurze przechowywanej, która wstawia wiersz do tabeli, Chciałbym ustawić ostatnią kolumnę (FieldD) do @prmSomeValue, chyba że jest on zerowy, w przeciwnym razie wystarczy użyć wartości domyślnej zdefiniowane dla tej kolumny.Czy istnieje sposób warunkowego używania domyślnych wartości kolumny w instrukcji INSERT..SELECT?
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
Działa, ale narusza zasadę DRY. Próbuję znaleźć sposób, aby to zrobić za pomocą pojedynczej instrukcji wstawiania. Coś wzdłuż linii następującego pseudokodu.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
FROM MyOtherTable
Ktoś ma jakieś pomysły?
Update - Jeszcze jeden skręt
Domyślne ograniczenie nie jest wartością dosłowne, ale funkcja, jak pokazano poniżej.
...DEFAULT (suser_sname()) FOR [FieldD]
Aktualizacja
I wreszcie punted i wybrał mniejsze zło i po prostu kopiowane domyślną funkcję wartości do mojego zapytania zamiast spada aż do domyślnie skonfigurowany do kolumny. Nie podoba mi się to, ale wykonuje to zadanie z mniejszą liczbą powtórzeń w zapytaniu.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
FROM MyOtherTable
Interesujący pomysł. Nie jestem pewien, czy jest to lepsze, ale zdecydowanie warte podniesienia. – JohnFx
Dzięki JohnFx, myślę, że może być lepiej, gdy istnieje więcej niż jedna opcjonalna kolumna, która ma być traktowana w ten sposób. Wtedy możesz powiedzieć "JEŚLI nie jest NULL ORB lub NIE JEST NULL, UPDATE SET foo = COALESCE (@foo, foo), bar = COALESCE (@bar, bar) GDZIE" itp., Zamiast pisania instrukcji insert dla każdej możliwej kombinacji. –
Użyj ISNULL zamiast COALESCE, COALESCE jest przeznaczony dla wielu argumentów. Nie pójdę do pola = podejście do parametrów/pola, zabije wydajność SQL, co utrudni optymalizację zapytań i wykorzystanie indeksów. Prosta instrukcja if byłaby znacznie wydajniejsza. – Zyphrax