問題は、CSVデータを解析しているようです。 XMLで解析し、ソーステーブルの更新を処理するためにmerge
を使用するアプローチをとった。下の例では、e
という名前のテーブルを作成し、いくつかのCSVデータを@CSV
に割り当てました。以下のコードは全体的な動作例です。
-- Just creating a working space
create table e (
EmpID int,
Location int,
Active int
)
insert e values (109, 2, 1), (109, 3, 1), (109, 4, 1)
declare @csv varchar(100) = '1,2,5' -- Assuming everything is nice integer data
select 'Before merge', * from e
merge e as target
using (select distinct e.EmpID
, m.n.value('.[1]', 'varchar(8000)') Location
from (select e.*
, cast('<xmlroot><rowdata>' + replace(@csv, ',', '</rowdata><rowdata>') + '</rowdata></xmlroot>' as xml) x
from e) e
cross apply x.nodes('/xmlroot/rowdata') m(n)) as source
on target.EmpID = source.EmpID and target.Location = source.Location
when matched then
update set Active = 1
when not matched then
insert (EmpId, Location, Active)
values (source.EmpID, source.Location, 1)
when not matched by source then
update set Active = 0
;
select 'After merge', * from e
[MERGE](https://msdn.microsoft.com/en-GB/library/bb510625.aspx)で行うことができます。 –
ここでは、MERGEはソリューションの一部に過ぎません。区切られた値のリストを受け取っているので、まず値を解析または分割する必要があります。ここにはこのステップのための素晴らしいリソースがあります。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings次に、MERGEを使用して、あなたの探しているアップサンプリングを実行できます。しかし、注意してください.... upsertsのためのMERGEを使用すると、問題を引き起こす可能性があります。 https://connect.microsoft.com/SQLServer/feedback/details/723696/basic-merge-upsert-causing-deadlocks –