2011-01-04 21 views
6

Podczas pisania instrukcji INSERT z wieloma kolumnami, byłoby miło mieć wartość obok nazwy kolumny, podobnie jak w instrukcji UPDATE. Coś jak:Napisz instrukcje INSERT z wartościami obok nazw kolumn?

insert into myTable 
set 
    [col1] = 'xxx', 
    [col2] = 'yyy', 
    [col3] = 42 
    etc... 

Czy są jakieś sztuczki naśladujące to?

Myślałem, że jestem na coś z tym:

insert into myTable 
select 
    [col1] = 'xxx', 
    [col2] = 'yyy', 
    [col3] = 42 
    etc... 

Ale aliasy nie są rzeczywiście związane z kolumny tabeli wstawić i jeśli ktoś dodaje nową kolumnę do tabeli może to naprawdę wkręcić rzeczy . Ktoś ma jakieś inne pomysły na to, jak można to zrobić?

+0

Jest to jedna z prawdziwych irytacji SQL.I to powoduje błędy, ponieważ łatwo jest zmienić zamówienie przez przypadek i jeśli typy danych są kompatybilne, nagle wpisujesz numer telefonu w kolumnie email bez żadnych błędów. – HLGEM

+0

Ja też naprawdę chciałbym, żeby SQL zapewnił sposób na zrobienie tego. Poprawiłoby to znacznie czytelność. –

Odpowiedz

9

Najbliższym dostaniesz byłoby określić kolumny na wkładce (to uchroni Cię od troski o nową kolumnę dodawanych) i alias wartości, na select (co daje pewną autodokumentującego kodu).

insert into myTable 
    ([col1], [col2], [col3]) 
    select 'xxx' as [col1], 'yyy' as [col2], 42 as [col3] 
+0

Aliasy nie są wymagane, przy założeniu, że wybrana kolejność jest zgodna z kolejnością kolumn. Chociaż mogą pomóc w utrzymaniu rzeczy wyraźnie wskazanych. :) –

+0

@Rocky Madden: Zgoda. Jak wskazałem w mojej odpowiedzi, włączyłem aliasy bardziej jako próbę samodzielnego udokumentowania kodu. –

+0

Chciałem tylko upewnić się, że było jasne dla PO. Jak zwykle masz rację na pieniądze! –

-3

INSERT INTO myTable (col1, col2, col3) 
SELECT 'xxx' [col1], 'yyy' [col2], '42' [col3]
+0

To jest to samo, co przykład, który dałem. Nie chcę tego, ponieważ jeśli ktoś doda kolumnę do myTable, może potencjalnie wstawić dane do niewłaściwej kolumny. – adam0101

+0

W żadnym wypadku nie powinieneś wkładać wkładki bez określania kolumny we wkładce. To jest zły, zły, zły kod. – HLGEM

+0

Zgadzam się, błędnie przeczytałem pytanie. Edytowane – brian

1

W przypadku dużych wkładek wykonałem fantazyjne (i być może zbyt przelotne) układy. Kilka przykładów:

INSERT MyTable (MyTableId,  Name,    Description,  SomeStringData1 
       ,SomeStringData2, SomeStringData3, SomeStringData4, MoreStringData1 
       ,MoreStringData2, MoreStringData3, MoreStringData4, SomeNumericData1 
       ,SomeNumericData2, SomeNumericData3, SomeNumericData4, MoreNumericData1 
       ,MoreNumericData2, MoreNumericData3, MoreNumericData4, BigBlobAA 
       ,BigBlobBB,  EnteredAtDate, UpdatedAtDate, RevisedAtDate 
       ,NeedAnotherDate) 
values 
       (@MyTableId,  @Name,    @Description,  @SomeStringData1 
       ,@SomeStringData2, @SomeStringData3, @SomeStringData4, @MoreStringData1 
       ,@MoreStringData2, @MoreStringData3, @MoreStringData4, @SomeNumericData1 
       ,@SomeNumericData2, @SomeNumericData3, @SomeNumericData4, @MoreNumericData1 
       ,@MoreNumericData2, @MoreNumericData3, @MoreNumericData4, @BigBlobAA 
       ,@BigBlobBB,  @EnteredAtDate, @UpdatedAtDate, @RevisedAtDate 
       ,@NeedAnotherDate) 

To działa, jeśli jesteś cholernie pewien, że przyzwyczajenie kiedykolwiek być wstawienie kolumny lub innego modyfikowania co jest włożona. Zyskuje wszystko na jednym ekranie i sprawia, że ​​dość łatwo jest określić, jaka wartość trafia do której kolumny.

Jeśli wstawione wartości mogą zmieniać lub są złożone (takie jak sprawozdania przypadku), mam następujące (Wysunięcie wszystkich ale co piątej pozycji):

INSERT MyTable 
    (
    MyTableId 
    ,Name 
    ,Description 
    ,SomeStringData1 
    ,SomeStringData2 
    ,SomeStringData3 
    ,SomeStringData4 
    ,MoreStringData1 
    ,MoreStringData2 
    ,MoreStringData3 
    ,MoreStringData4 
    ,SomeNumericData1 
    ,SomeNumericData2 
    ,SomeNumericData3 
    ,SomeNumericData4 
    ,MoreNumericData1 
    ,MoreNumericData2 
    ,MoreNumericData3 
    ,MoreNumericData4 
    ,BigBlobAA 
    ,BigBlobBB 
    ,EnteredAtDate 
    ,UpdatedAtDate 
    ,RevisedAtDate 
    ,NeedAnotherDate 
) 
values 
    (
    MyTableId 
    ,Name 
    ,Description 
    ,SomeStringData1 
    ,SomeStringData2 
    ,SomeStringData3 
    ,SomeStringData4 
    ,MoreStringData1 
    ,MoreStringData2 
    ,MoreStringData3 
    ,MoreStringData4 
    ,case 
     when something then 'A' 
     when orOther then 'B' 
     else 'Z' 
    end 
    ,SomeNumericData2 
    ,SomeNumericData3 
    ,SomeNumericData4 
    ,MoreNumericData1 
    ,MoreNumericData2 
    ,MoreNumericData3 
    ,MoreNumericData4 
    ,BigBlobAA 
    ,BigBlobBB 
    ,EnteredAtDate 
    ,UpdatedAtDate 
    ,RevisedAtDate 
    ,NeedAnotherDate 
) 

(Po dodaniu tego oświadczenia przypadku I " zliczono wcięcia ", aby upewnić się, że wszystko jest odpowiednio ustawione.)

Przygotowanie do poprawnej pracy wymaga nieco wysiłku, ale może uprościć konserwację, obsługę i późniejsze modyfikacje.

+0

Jestem z tobą, osobiście, mam wiele kolumn, które ustawiam w linii od trzech do czterech wierszy i ustawię dokładnie linię klauzuli SELECT lub value. Nadal muszę ręcznie chackować, ale przynajmniej łatwiej, gdy kolumny są ustawione prawidłowo, tak jak w pierwszym przykładzie. – HLGEM

0

Gdy chcesz wstawić wiele wierszy jednocześnie, korzystając albo z 2008 wierszy styl konstruktorów, czy korzystasz ze starszej składni union all, wydają się być wdzięczny, że ty nie trzeba określać nazwy kolumn dla każdego wiersza.

2008 wiersz konstruktorzy:

insert into myTable (col1,col2,col3) 
values ('xxx','yyy',42), 
('abc','def',19), 
('HJK','www',-4) 

UNION ALL:

insert into myTable (col1,col2,col3) 
select 'xxx','yyy',42 union all 
select 'abc','def',19 union all 
select 'HJK','www',-4 
+0

Tak, nie widzę nazw kolumn, jeśli wstawiasz wiele wierszy, ale miałem na myśli wstawianie pojedynczego wiersza z wieloma kolumnami. – adam0101

1

Zasadniczo nie. Składnia SQL INSERT jest na liście wszystkich kolumn, a następnie wszystkich wartości. Nawet jeśli uda ci się znaleźć sztuczkę do wyrażenia składni w taki sposób, w jaki chcesz, to będzie ona nieprzenośna i myląca dla następnej osoby, która będzie musiała utrzymać twój kod.

Jeśli chcesz wizualne odwzorowanie kolumn na wartości, użyj czegoś podobnego do odpowiedzi Philipa powyżej. Ale nie poświęcaj cennego czasu, aby twój kod uniknął standardowej składni.

+0

Dobrze, że czasami szukam sposobów, aby poprawić sobie sytuację, ale nigdy nie powinienem tego robić z efektem ubocznym uczynienia mojego kodu nieczytelnym lub mylącym. – adam0101

+0

Doceniam, skąd przybywasz, i często robię układy takie jak sugerował Philip (oprócz tego, że próbuję pozostać w jednym wierszu, więc wartość jest bezpośrednio pod nazwą kolumny, nawet jeśli linia jest bardzo, bardzo długa). –

Powiązane problemy