使用列名旁边的值编写INSERT语句?

时间:2011-01-04 15:03:53

标签: sql sql-server tsql sql-server-2008 insert

在编写包含大量列的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 个答案:

答案 0 :(得分:10)

您最接近的将是指定插入的列(这将保护您免受您对添加的新列的关注)和别名选择的值(这会给您一定程度的自我记录码)。

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

答案 1 :(得分:1)

对于大插页,我做过花哨(也许是过度挑剔)布局。一些例子:

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声明后,我“计算了缩进数”,以确保我的所有内容都正确排列。)

需要花费一些精力才能正确布局,但它可以使维护,支持和后续修改变得更加简单。

答案 2 :(得分:1)

基本上没有。 SQL INSERT的语法是列出所有列,然后是所有值。即使你能找到一种以你想要的方式表达语法的技巧,它也是不可移植的,让下一个人难以维护你的代码。

如果您想要将列的可视化映射到值,请使用上面的Philip的答案。但请不要花费任何宝贵的时间来使代码避免使用标准语法。

答案 3 :(得分:0)

如果要同时插入多行,使用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

答案 4 :(得分:0)

我想到的快速解决方案如下:

insert into MyTable
(ColumnName1, ColumnName2, ColumnName3)
values
(/*ColumnName1*/'value1', /*ColumnName2*/'value2', /*ColumnName3*/'value3')

答案 5 :(得分:-3)


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