2014-09-19 48 views
0

我有一個包含2個表SQL Server數據庫,這些表由一個ID字段加入如下:SQL服務器MERGE與內2源/目標表加入

Table 1 
ID, Selection, Field1, Field2 

Table 2 
ID, Field3, Field4 

這些表由外國接合鍵刪除約束級聯,以便如果表1中的字段被刪除,表2中與該ID匹配的所有字段也將被刪除(但你知道)

我有另一個存儲過程,通過選擇兩個表的字段:

SELECT [Table2].* FROM [Table2] INNER JOIN [Table1] ON [Table1].[ID] = [Table2].[ID] WHERE [Table1].Selection = @selectionParameter 

我想從我的c#程序更新這些表。我以前一直在做以下操作:

DELETE FROM [Table1] WHERE Selection = @selectionParameter 

INSERT INTO [Table1] SELECT * FROM @table1Parameter (user defined table type passed in from c#) 

INSERT INTO [Table2] SELECT * FROM @table2Parameter 

我現在想通過做不強制執行完全刪除所有領域的重新插入,而是在執行合併這更精簡。

到目前爲止,我有Table1上的合併功能,但似乎無法獲得與Table2右邊的關係。

這是我到目前爲止有:

MERGE INTO [Table1] AS target 
USING @Table1Parameter AS source 
ON target.ID = source.ID 
AND target.Selection = @selectionParameter 

WHEN NOT MATCHED BY TARGET 
    THEN INSERT (ID, Selection, Field1, Field2) VALUES (source.ID, etc) 
WHEN NOT MATCHED BY SOURCE AND target.Selection = @selectionParameter 
    THEN DELETE; 

這是一個非常類似的查詢: SQL Server MERGE + Joining other tables

我已經使用從上面的答案,並從這種關係中的select語句傳遞的結果嘗試上面進入臨時表,但沒有成功。

有人可以幫我整理我的第二張表嗎?

編輯: 要求提供完整的代碼:

USE [MyDatabase] 
GO 
ALTER PROCEDURE [dbo].[MergeTables] 

@Selection int, 
@Table1Parameter udtt_1 READONLY, 
@table2Parameter udtt_2 READONLY 

AS 

,那麼你在上面看到的合併聲明。

c#代碼只是使用數據表作爲參數執行非查詢。 C#代碼目前功能齊全。

+0

你能提供完整的代碼嗎?像** @ table2Parameter **,** @ selectionParameter **等... – 2014-09-19 16:25:06

+0

在過程中,您已經通過了 - ** @ Selection **並在合併語句中使用了 - ** @ selectionParameter **變量。這是對的嗎 ?? – 2014-09-19 16:51:56

+0

woops,對不起,這是一個錯誤在這裏,它是相同的變量。較低代碼的名稱應該是'selectionParameter' – 2014-09-22 07:42:02

回答

0

這是修復,但它確實涉及到臨時表畢竟:

USE [myDatabase] 
GO 

ALTER PROCEDURE [dbo].[MergeTables] 
--declare parameters passed in from c# 
--tables coming from c# are edited versions of the SQL tables. 
@selectionParameter int, 
@Table1Parameter udtt_1 READONLY, 
@table2Parameter udtt_2 READONLY 

AS 

--merge edits into table 1 
MERGE INTO [Table1] AS target 
USING @Table1Parameter AS source 
ON target.ID = source.ID 
AND target.Selection = @selectionParameter 

WHEN NOT MATCHED BY TARGET 
THEN INSERT (ID, Selection, Field1, Field2) VALUES (source.ID, source.Selection, source.Field1, source.Field2) 
WHEN NOT MATCHED BY SOURCE AND target.Selection = @selectionParameter 
THEN DELETE; 

--define a temp table to hold table 2 editable rows 
SELECT [Table2].* INTO T FROM [Table2] 
INNER JOIN [Table1] ON [Table1].[ID] = [Table2].[ID] WHERE [Table1].[Selection] = @selectionParameter 

--merge edits into temp table 
MERGE INTO T AS target 
USING @table2Parameter AS source 
ON target.ID = source.ID 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (ID, Field3, Field4) VALUES (source.ID, source.Field3, source.Field4) 
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE; 

--place edited or new rows into table 2 
MERGE INTO [Table2] AS target 
USING T AS source 
ON target.ID = source.ID 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (ID, Field3, Field4) VALUES (source.ID, source.Field3, source.Field4); 

DROP TABLE T; 

請讓我知道這需要澄清。這非常複雜,花了我幾個小時!希望它可以幫助其他人在這種情況下。