循环遍历众多“如果存在更新,否则插入”语句?

时间:2010-09-22 17:31:56

标签: sql sql-server tsql

我有一个脚本需要在表中插入50多行,有没有办法循环我要插入的每一行,而不是在TSQL中将此语句编码50 +次?

IFEXISTS ( SELECT 1 FROM table where column 1 = )
    UPDATE table
    Column1 = value,
    Column2 = value,
    Column3 = value,
    Column4 = value
    WHERE column 1 =
    ELSE
    INSERT INTO table
    (Column1, Column2, Column3, Column4)
    VALUES
    (value, value, value, value)

3 个答案:

答案 0 :(得分:7)

更好的是,您可以将记录放在临时表中,然后更新所有存在的记录并插入两个查询中不存在的记录。

示例:

select Column1 = 1, Column2 = 2, Column3 = 3
into #temp
union all select 1,2,3
union all select 1,2,3
union all select 1,2,3
...
union all select 1,2,3

update t
set Column1 = p.Column1, Column2 = p.Column2, Column3 = p.Column3
from table t
inner join #temp p on p.Column1 = t.Column1

insert into table (Column1, Column2, Column3)
select p.Column1, p.Column2, p.Column3
from #temp p
left join table t on t.Column1 = p.Column1
where t.Column1 is null

drop table #temp

答案 1 :(得分:0)

嗯,SQL是一种基于SET的语言,所以理想情况下你将它保存在一个集合中。要迭代循环,你可以使用光标,但为什么呢?

以下是MSDN blog的另一种方法:

UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)

答案 2 :(得分:0)

考虑MERGE语句(特别是链接页面上的第一个示例)。

这允许您在比较表的内容和选择查询时定义添加,更新或删除操作。