2016-04-19 9 views
1

私はコンマ区切りとしてデータを取得するシナリオがあります。たとえば、表のデータは以下のようになります。SQLカンマ区切りの値dml操作

EmpID Location Active 
109  2  1  
109  3  1  
109  4  1 

私はEMPID 109、Location(1,2,5)としてデータを受信しました。私がする必要があるのは、テーブルに存在するため、Insert 1,5です。テーブル2に存在するUpdate 2です。テーブルのデータに存在するが、受け取ったデータには存在しないので、テーブルの3,4をアクティブな0に設定します。私は複数のSQLを使用する代わりに1つのSQLでこれをすべてやろうとしています。

+0

[MERGE](https://msdn.microsoft.com/en-GB/library/bb510625.aspx)で行うことができます。 –

+0

ここでは、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 –

答えて

0

問題は、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 
+0

ssmsのSQLエディタでm.n.valueおよびx.nodesでエラーが発生する。 x.nodesが無効なオブジェクトであり、m.n.valueあいまいな列名または関数名がありません。 – user3038399

+0

最初にコードブロック全体をコピーしようとしましたか? (SSMSで正常に実行しました)また、実行しているSQL Serverのバージョンは? – user212514