【问题标题】:SQL Server - Insert into table - All column values same except for 1SQL Server - 插入表 - 除了 1 之外的所有列值相同
【发布时间】:2014-04-25 13:51:21
【问题描述】:

假设我的 SQL Server 2008 DB 中的表有以下插入语句:

INSERT INTO MyTable 
    ([Val1], [Val2], [Val3], [Val4])
VALUES
    ('val1', 'val2' 'val3', 'val4_a'),
    ('val1', 'val2' 'val3', 'val4_b'),
    ('val1', 'val2' 'val3', 'val4_c'),
    ('val1', 'val2' 'val3', 'val4_d');

换句话说,[Val1][Val3] 的所有值都保持不变,但 [Val4] 不断变化。

我正在考虑按照以下方式做一些事情:

Declare @Val1 varchar(10)
Declare @Val2 varchar(10)
Declare @Val3 varchar(10)   
Declare @Val4  ... some kind of list of varchar(10) ...

Set @Val1 = 'val1'
Set @Val2 = 'val2'
Set @Val3 = 'val3'
Set @Val4 = ('val4_a', 'val4_b', 'val4_c', 'val4_d')

然后通过@Val4 进行某种循环,在这种情况下只需要编写一个插入语句。这样可以非常轻松地更改/更新,并使我的生活变得更加轻松!

我知道这行不通——我只是把它作为我希望完成的一个例子——但是做这样的事情最好的方法是什么?

谢谢,我希望这个问题有意义!!

【问题讨论】:

  • @Val4 的值从何而来?它是一个序列,还是从客户端传递到过程中的东西?
  • 我会自己输入它们...想象一下我必须为几个汽车制造商更新这个数据库,我必须选择为哪个制造商做它...有时可能只有 2 个,比如('Ford', 'BMW'),其他时候可能是 10... 它根据客户要求而变化。
  • 那么 Gordon 的回答应该可以正常工作。
  • @dean,请查看我对他的回复...这意味着注释掉一些更新语句/添加新语句,因为@Val4 中的值数量发生了变化...

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


【解决方案1】:

如果您使用SELECT 而不是VALUES,您可以为您的INSERT 编写任意查询:

INSERT INTO MyTable 
    ([Val1], [Val2], [Val3], [Val4])
SELECT 'val1','val2','val3',v4.v
FROM (SELECT 'val4_a' union all
      SELECT 'val4_b' union all
      SELECT 'val4_c' union all
      SELECT 'val4_d') v4(v)

当然,如果您已经有一个table variable,比如@v4,其中每个所需值包含一行,那就更容易了:

INSERT INTO MyTable 
    ([Val1], [Val2], [Val3], [Val4])
SELECT 'val1','val2','val3',v4.v
FROM @v4 v4

当然,它可以插入 1 行、4 行、100000 行,不管你在@v4 中插入了多少行。


所以,一个完整的脚本可以是:

DECLARE @v4 table (v varchar(10) not null)
INSERT INTO @v4(v) VALUES ('val4_a'),('val4_b'),('val4_c'),('val4_d')

INSERT INTO MyTable 
    ([Val1], [Val2], [Val3], [Val4])
SELECT 'val1','val2','val3',v4.v
FROM @v4 v4

【讨论】:

  • 谢谢,Damien,但挑战在于,这仍然需要进行更多的更改,而不仅仅是创建一个列表并以某种方式循环遍历它......虽然我不知道这是否可能... 但是,如果一次 @val4 包含 3 个值,而下一次包含 10 个值,您能看出这有多困难吗?
  • 我刚刚做到了! - 感谢 Damien 的更新,您能否帮助我了解创建 @v4 的最佳语法以便它灵活??
【解决方案2】:

您可以在values 语句中使用变量。所以:

INSERT INTO MyTable([Val1], [Val2], [Val3], [Val4])
VALUES
    (@val1, @val2, @val3, 'val4_a'),
    (@val1, @val2, @val3, 'val4_b'),
    (@val1, @val2, @val3, 'val4_c'),
    (@val1, @val2, @val3, 'val4_d');

这能实现你的目标吗?

【讨论】:

  • 谢谢,Gordon,我知道我可以使用它们,但我希望,例如,将@Val4 设为一个列表,然后根本不必更改更新语句......那有意义吗?循环遍历@Val4...中的所有值...
猜你喜欢
  • 1970-01-01
  • 2016-10-18
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多