2014-09-19 1 views
0

У меня есть база данных сервера SQL, который содержит 2 таблицы, эти таблицы соединяются поле ID следующим образом:SQL сервер MERGE 2 источника/целевые таблицы с внутренним соединением

Table 1 
ID, Selection, Field1, Field2 

Table 2 
ID, Field3, Field4 

Таблицы соединены иностранцем ключ с каскадом на ограничение удаления, так что если поле в таблице 1 будет удалено, все поля в таблице 2, соответствующие идентификатору, также будут удалены (но вы знали это)

У меня есть еще одна хранимая процедура, которая вытаскивает необходимые полей по выбору для обеих таблиц:

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 

Теперь я хотел бы сделать это более обтекаемым, не заставляя полный удалить и повторно вставить все полей и вместо выполнения слияния.

До сих пор у меня есть функционирование слияния в таблице1, но, похоже, не получается получить связь с таблицей 2 справа.

Вот что я до сих пор:

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

Я попытался с помощью ответа от выше и передачи результатов из соотношения оператора выбора выше в временную таблицу, но не имели успеха.

Может кто-нибудь помочь мне интегрировать мой второй стол в это?

редактировать: Попросил предоставить полный код:

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

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

AS 

то слияние заявление вы видите выше.

Код C# просто выполняет запрос без использования данных в качестве параметра. Код C# в настоящее время полностью работоспособен.

+0

Можете ли вы предоставить полный код? как ** @ таблица2Parameter **, ** @ выборParameter ** и т. д. –

+0

В процедуре, которую вы прошли, - ** @ Выбор ** и в заявлении о слиянии, которое вы использовали - ** @ selectionParameter **. Правильно ли это? –

+0

woops, извините, что здесь была ошибка, это та же переменная. имя в нижнем коде должно быть «selectionParameter» –

ответ

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; 

Пожалуйста, дайте мне знать, если это нуждается в уточнении. Это ужасно сложно и заняло у меня часы! Надеюсь, это может помочь кому-то еще в этой ситуации.

Смежные вопросы