Sql 是否在列名旁边使用值编写INSERT语句?

Sql 是否在列名旁边使用值编写INSERT语句?,sql,sql-server,tsql,sql-server-2008,insert,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... 但是别名实际

当编写一个包含很多列的INSERT语句时,最好像UPDATE语句一样在列名旁边有一个值。比如:

insert into myTable
set
  [col1] = 'xxx',
  [col2] = 'yyy',
  [col3] = 42
  etc...
有什么技巧可以模仿这个吗

我以为我发现了这件事:

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

但是别名实际上并没有与insert表的列相关联,如果有人向表中添加了一个新列,它可能会把事情搞砸。任何人对如何做到这一点还有其他想法吗?

最接近的方法是在insert上指定列(这将保护您不担心添加新列),并在select上别名值(这会给您某种程度的自文档化代码)


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

对于大的插入,我已经做了花哨的(也许是过分挑剔的)布局。一些例子:

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语句),我会执行以下操作(除第五项外,删除所有项):

(添加CASE语句后,我“计算缩进”以确保所有内容都正确排列。)


要使事情正确地布局起来需要一些努力,但它可以使维护、支持和后续修改更简单。

如果要同时插入多行,可以使用2008样式的行构造函数,也可以使用较旧的
union all
语法,您往往庆幸不必为每一行指定列名

2008行构造函数:

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

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

基本上不会。SQL INSERT的语法是列出所有列,然后列出所有值。即使你能找到一个技巧,以你想要的方式来表达语法,它将是不可移植的,并且让下一个不得不维护你的代码的人感到困惑


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

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

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

假设select顺序与into列顺序匹配,则不需要别名。尽管它们可能有助于保持事情的明确指示。:)@洛基·马登:同意。正如我在回答中指出的,我加入别名更多的是为了尝试自我记录代码。只是想确保OP清楚。像往常一样,你的钱是对的!这和我举的例子是一样的。我不希望这样,因为如果有人向myTable中添加列,它可能会将数据插入错误的列中。在任何情况下,如果不在插入中指定列号,都不应执行插入。这是一段糟糕的代码。我个人同意你的看法,如果我有很多列,我会将三列或四列行输出到一行,并使selct或values子句的行完全匹配。我仍然需要手动更改,但至少在第一个示例中正确排列列时会更容易。这是SQL真正的麻烦之一。它会导致错误,因为很容易意外更改订单,而且如果数据类型兼容,您会突然将电话号码毫无错误地放入电子邮件列中。我也非常希望SQL提供一种方法来做到这一点。这将极大地提高可读性。是的,如果插入多行,我可以看到不需要列名,但我指的是插入一行,其中包含很多很多列。好的一点,我有时会想办法让事情变得更好,但千万不要这样做,这样做的副作用是让我的代码变得不可读或令人困惑。我很欣赏你来自哪里,我经常像Philip建议的那样做布局(除非我尽量保持在一行上,以便值直接位于列名下,即使这行非常非常长)。
insert into myTable (col1,col2,col3)
select 'xxx','yyy',42 union all
select 'abc','def',19 union all
select 'HJK','www',-4
insert into MyTable
(ColumnName1, ColumnName2, ColumnName3)
values
(/*ColumnName1*/'value1', /*ColumnName2*/'value2', /*ColumnName3*/'value3')