1

次のデータを含むテーブルがあるとします。

Id   Value
1  | A
2  | B
3  | C

このテーブルの値を値のコレクションと同期する必要があります。コレクションにない行を削除し、ある行を追加して、一致する行をそのままにしておきたいと思います。

この値のコレクションが与えられた場合:

C,D,E

操作後、テーブルに次のものが含まれていると予想されます。

Id   Value
3  | C
4  | D
5  | E

複数のクエリを必要とする明らかなソリューションのほとんどを認識しています。私が探しているのは、より効率的な解決策です。何とかここで MERGE ステートメントを使用できますか?

編集- コレクション値は C# コレクション (List<string>) にあり、.NET で標準の SqlConnection/SqlCommand を使用してクエリを実行しています。

これは、値の削除を処理するために私が考えたものです。しかし、これを作成するには少し文字列を連結する必要があるため、嫌われるかもしれません。

DELETE FROM [MyTable] 
WHERE [Value] NOT IN ('C','D','E')

しかし、値を追加するには、コレクション内の値ごとに複数の IF NOT EXISTS THEN INSERT クエリ ステートメントを作成する必要があるようです。

4

2 に答える 2

1

単一の SQL ステートメントでこれを実行できるとは思いませんが、ジョブを実行するストアド プロシージャを作成できます。

create procedure upsertnewrecords(
   @collection varchar(max)
  ) as
begin
  delete 
  from yourtable 
  where charindex(','+value+',', ','+@collection+',') = 0

  ;with cte as (
    select split.t.value('.', 'VARCHAR(100)') newvalue  
    from (
      select cast ('<M>' + replace(@collection, ',', '</M><M>') + '</M>' as xml) as String    
    ) t 
    cross apply String.nodes ('/M') AS Split(t)  
  )

  insert into yourtable
  select newvalue 
  from cte
  where newvalue not in 
    (select value from yourtable)
end

このストアド プロシージャは、最初CHARINDEXに現在のリストにない値を削除するために使用し、次に を使用CROSS APPLYしてコンマ区切りリストをテーブル値リストに変換し、最後に共通テーブル式を介してそれらを挿入します。

于 2013-07-09T01:26:00.063 に答える