Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过无数的“循环”;如果存在更新,则插入";声明?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 通过无数的“循环”;如果存在更新,则插入";声明?

Sql 通过无数的“循环”;如果存在更新,则插入";声明?,sql,sql-server,tsql,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 IN

我有一个脚本需要在一个表中插入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)

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

以下是另一种方法:

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


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

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

例如:

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

什么版本的SQL Server?如果2008,您可以对包含新行和现有行的表变量使用
Merge
。为什么人们在注释中回答问题?用几行测试了这一点,似乎效果非常好。非常感谢。
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