Написать операторы INSERT со значениями рядом с именами столбцов? - PullRequest
8 голосов
/ 04 января 2011

При написании оператора INSERT с большим количеством столбцов было бы хорошо иметь значение рядом с именем столбца, как в операторе UPDATE.Что-то вроде:

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

Есть ли какие-то хитрости, чтобы имитировать это?

Я думал, что я был на что-то с этим:

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

Но псевдонимы не являютсяна самом деле он связан со столбцами таблицы вставки, и если кто-то добавит новый столбец в таблицу, он действительно может все испортить.У кого-нибудь есть идеи, как можно это сделать?

Ответы [ 6 ]

10 голосов
/ 04 января 2011

Самое близкое, что вы получите, - это указать столбцы на вставке (это защитит вас от беспокойства о добавлении нового столбца) и присвоить псевдонимы значениям выбора (что даст вам некоторую степень самодокументирования).код).

insert into myTable
    ([col1], [col2], [col3])
    select 'xxx' as [col1], 'yyy' as [col2], 42 as [col3]
1 голос
/ 04 января 2011

В основном нет. Синтаксис SQL INSERT состоит в том, чтобы перечислить все столбцы, а затем все значения. Даже если бы вы могли найти способ выразить синтаксис так, как вам хочется, он был бы непереносим и не позволял бы следующему человеку поддерживать ваш код.

Если вы хотите визуально сопоставить столбцы со значениями, используйте что-то в соответствии с ответом Филиппа выше. Но, пожалуйста, не тратьте свое драгоценное время, чтобы ваш код избегал стандартного синтаксиса.

1 голос
/ 04 января 2011

Для больших вставок я сделал причудливые (и, возможно, суетливые) макеты.Некоторые примеры:

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 )

Это работает, если вы чертовски уверены, что никогда не будете вставлять столбцы или иным образом изменять то, что вставляется.Он получает все на одном экране и позволяет довольно просто определить, какое значение входит в какой столбец.

Если вставленные значения могут измениться или являются сложными (например, операторы case), я делаю следующее(обойти все, кроме каждого пятого элемента):

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
  )

(После добавления этого оператора CASE я "посчитал отступы", чтобы убедиться, что все выстроено правильно.)

ТребуетсяНемного усилий, чтобы все правильно расположить, но это может упростить обслуживание, поддержку и последующую модификацию.

0 голосов
/ 29 октября 2018

Быстрое решение, которое я придумал, было следующее:

insert into MyTable
(ColumnName1, ColumnName2, ColumnName3)
values
(/*ColumnName1*/'value1', /*ColumnName2*/'value2', /*ColumnName3*/'value3')
0 голосов
/ 04 января 2011

Если вы хотите вставить несколько строк одновременно, используя конструкторы строк в стиле 2008 или старый синтаксис union all, вы, как правило, благодарны за то, что не нужно указывать имена столбцовдля каждой строки.

2008 конструкторы строк:

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 голосов
/ 04 января 2011

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