1

以下のサンプル コード スニペットを使用して、SQL Server 2005 データベース テーブルを更新しました。これは、一連のプロパティ (フィールド) を持つカスタム オブジェクトであるList<T>whereTを、行ルート要素内にネストされた行要素の XML 属性に変換します。

このようにして、1 つの SQL トランザクションで大量の挿入を行います。このようなルートに従って、挿入ではなく一連の XML更新を提供したいと考えました。このアプローチをどのように適応させるかについて、適切な情報源を見つけることができませんでした。たとえば、主キー A に基づいて B から F を更新するとします。

conn.Open();
cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = @"INSERT table (A,B,C,D,E,F) 
SELECT Tbl.Col.value('@A','nvarchar(50)'),
       Tbl.Col.value('@B','int'),
       Tbl.Col.value('@C','nvarchar(50)'),
       Tbl.Col.value('@D','nvarchar(1000)'),
       Tbl.Col.value('@E','nvarchar(50)'),
       Tbl.Col.value('@F','nvarchar(50)')
FROM @xml.nodes('//row') Tbl(Col)";
cmd.Parameters.Add("@xml", SqlDbType.Xml).Value = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("rows",
toInsert.Select(p => new XElement("row", new XAttribute("A", x.Prop1),
                     new XAttribute("B", x.Prop2),
                     new XAttribute("C", x.Prop3),
                     new XAttribute("D", x.Prop4),
                     new XAttribute("E", x.Prop5),
                     new XAttribute("F", x.Prop6))))).ToString();
Console.WriteLine(cmd.ExecuteNonQuery().ToString() + " row(s) affected.");
conn.Close();
4

1 に答える 1

0

この方法を使い続けたい場合は、次のSQLを使用する代わりに、挿入を変更して更新を実行できます。

update  yourTable 
        set b = Tbl.Col.value('@B','int')
        --other cols...
from     yourTable y
join    @xml.nodes('//row') Tbl(Col) on
        y.a = Tbl.Col.value('@A','nvarchar(50)')
于 2012-05-18T19:55:00.347 に答える