2013-01-21 94 views
0

我有一個從Web服務獲得的行集合。其中一些行將被插入,一些是現有行的更新。除非我對錶中的ID進行查詢,否則無法通知。如果我找到它,然後更新。如果我沒有,然後插入。根據行是否存在更新或插入數據

Select @ID from tbl1 where ID = @ID 

IF @@ROWCOUNT = 0 
BEGIN 
Insert into tbl1 
values(1, 'AAAA', 'BBBB', 'CCCC', 'DDD') 
END 
ELSE 
BEGIN 
UPDATE tbl1 
SET 
A = @AAA, 
B = @BBB, 
C = @CCC, 
D = @DDD 
WHERE ID = @ID 
END 

我試圖找出最EFFIENT的方法來更新/插入這些行插入到表中,而不將它們傳遞到存儲過程中一次一個。

更新1

我應該我使用的SQL Server 2005。另外,如果我有300條記錄,我不想做300存儲過程調用已經提到。

+0

聽起來像您正在尋找[MERGE](http://msdn.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx)語句! – Josien

回答

0

從行收集你從服務器獲取找出哪些是已經存在:

select @id from tbl1 where id in (....) 

然後,你必須是在表ID列表和一個有不在表。 您將有2個批處理操作:一個用於更新,另一個用於插入。

1

不是先支付一次查找,然後再用另一次查找進行更新,只需繼續並嘗試更新即可。如果更新沒有找到任何行,您仍然只支付一次搜索,並且不必引發異常,但您知道可以插入。

UPDATE dbo.tbl1 SET 
A = @AAA, 
B = @BBB, 
C = @CCC, 
D = @DDD 
WHERE ID = @ID; 

IF @@ROWCOUNT = 0 
BEGIN 
    INSERT dbo.tbl1(ID,A,B,C,D) 
    VALUES(@ID,@AAA,@BBB,@CCC,@DDD); 
END 

你也可以看看MERGE但我回避遠離這一切,因爲(a)的語法是艱鉅和(b)已經有很多bug和幾個人仍沒有得到解決。

當然,不是一次只做一個@ID,而應該使用表值參數。現在

CREATE TYPE dbo.tbl1_type AS TABLE 
( 
    ID INT UNIQUE, 
    A <datatype>, 
    B <datatype>, 
    C <datatype>, 
    D <datatype> 
); 

您的存儲過程可以是這樣的:

CREATE PROCEDURE dbo.tbl1_Update 
    @List AS dbo.tbl1_type READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE t 
    SET A = i.A, B = i.B, C = i.C, D = i.D 
    FROM dbo.tbl1 AS t 
    INNER JOIN @List AS i 
    ON t.ID = i.ID; 

    INSERT dbo.tbl1 
    SELECT ID, A, B, C, D 
    FROM @List AS i 
    WHERE NOT EXISTS 
    (
     SELECT 1 
     FROM dbo.tbl1 WHERE ID = i.ID 
    ); 
END 
GO 

現在你只需通過從C#您的數據表或其它收集直接進入程序作爲一個參數。

+0

這很酷,但唯一的問題是我正在使用SQL 2005 –

+1

@Kyle嗯,這不是你在發佈問題時所說的... –

+0

是的。對不起。 –

1

最有效的方法將首先嚐試更新表,如果它返回0行更新,然後只做插入。爲前。

UPDATE tbl1 
    SET 
    A = @AAA, 
    B = @BBB, 
    C = @CCC, 
    D = @DDD 
    WHERE ID = @ID  
IF @@ROWCOUNT = 0 
    BEGIN 
    Insert into tbl1 
    values(1, 'AAAA', 'BBBB', 'CCCC', 'DDD') 
    END 
    ELSE 
    BEGIN 

END 
0

我理解是這樣的:

在前端ü發出一個SQL語句

ArrayofIDsforInsert = select ID from tbl1 where ID not in (array of ids at the front end) 
ArrayofIDsforUpdate = (IntialArrayofids at frontend) - (ArrayofIdsforInsert) 

一個INSERT INTO表和一個更新表...

now call the insert into table with ArrayofIds for insert 
call the update table with ArrayofIds for update..