2010-09-22 75 views
3

我有一個腳本,需要插入50 +行到表中,有沒有辦法循環,但我想插入每一行,而不是編碼這下面的語句在TSQL 50 +次?循環通過衆多「if exists update,else insert」語句?

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) 
+1

什麼版本的SQL Server?如果2008年你可以使用'Merge'來對付包含新行和現有行的表變量。 – 2010-09-22 17:33:35

+0

SQL Sever 2005 - doh – user234702 2010-09-22 17:35:42

+0

爲什麼人們在評論中回答問題? – 2010-09-22 17:47:21

回答

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 
+0

測試了這幾行,似乎工作太棒了。非常感謝你。 – user234702 2010-09-22 17:45:20

0

那麼,SQL是一個基於SET的語言,所以最好把它保存在一個集合中。爲了迭代循環,你可以使用遊標,但爲什麼?

這裏是另一種方法關閉的MSDN blog的:

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

考慮MERGE聲明(具體第一個例子鏈接的頁面上)。

這使您可以在比較表格和選擇查詢的內容時定義添加,更新或刪除操作。