【问题标题】:Send a XML to a sp for insertion将 XML 发送到 sp 以进行插入
【发布时间】:2011-01-11 04:36:57
【问题描述】:

我有一个 myClass 的集合。我想使用 XML 将它发送到 sp。我不知道如何将集合转换为 xml。 将集合转换为 xml 后,我想将其发送到存储过程以进行批量插入

请帮忙

【问题讨论】:

  • 您处理 XML 仅仅是因为您想通过调用一个存储过程来处理集合中的所有项目吗?

标签: c# sql-server xml stored-procedures


【解决方案1】:

您可以使用 XmlSerializer 将您的类序列化为 XML,然后将该 XML 值传递到存储过程中,然后在存储过程中遍历节点。除了 XML 之外,传递多行数据的另一种选择是使用 Table-Valued Parameters

XML 方法看起来像这样:

MyClass myClass = new MyClass();

XmlSerializer serializer = new XmlSerializer(typeof(MyClass));

XmlWriterSettings settings = new XmlWriterSettings()
{
    Encoding = new UnicodeEncoding(false, false)
};

StringBuilder xml = new StringBuilder();

using (XmlWriter xw = XmlWriter.Create(xml, settings))
{
    serializer.Serialize(xw, myClass);
}

...

SqlCommand cmd = new SqlCommand()
{
    CommandText = "InsertMyClass",
    CommandType = CommandType.StoredProcedure
};

SqlParameter sqlParam = new SqlParameter()
{
    ParameterName = "@x",
    SqlDbType = SqlDbType.Xml,
    Value = xml.ToString()
};

cmd.Parameters.Add(sqlParam);

int count = cmd.ExecuteNonQuery();

为了举例,假设您的 XML 如下所示:

<MyClass>
  <Item>
    <ID>1</ID>
    <Property1>prop 1</Property1>
    <Property2>prop 2</Property2>
  </Item>
</MyClass>

然后存储过程可以进行插入:

CREATE PROCEDURE InsertMyClass
( 
    @x XML 
) 
AS
BEGIN

  INSERT INTO table (ID, Prop1, Prop2)
  SELECT 
      CAST(CAST(r.i.query('./ID/text()') AS VARCHAR(20)) AS INT) ,
      CAST(r.i.query('./Property1/text()') AS VARCHAR(20)),
      CAST(r.i.query('./Property2/text()') AS VARCHAR(20))
  FROM   
      @x.nodes('/MyClass/Item') R(i)

END

【讨论】:

  • 呃!没有必要为此使用光标... :-(
  • @RBarryYoung -- 是的,我有点说可能有更好的方法。也许您可以发布更好的答案或提供链接,甚至可以根据需要编辑我的答案?
  • 也许只有我一个人,但没有光标似乎更容易。 :-)
  • @RBarryYoung:我同意——看起来好多了!
【解决方案2】:

您可以使用XmlSerializer 将类序列化为 xml。您可以通过使用属性在一定程度上控制序列化模式 - 有关详细信息,请参阅 MSDN 链接。

在 Sql Server 端,您可以使用 OPENXML 将 xml 文档转换为可用于插入表中的行集。有关 OpenXml 的信息,请参阅 this (2000 version)this (2008 version) - 这两个链接都包含可以帮助您入门的示例。

最后,Bulk Insert from XML data 是可能的,但这通常会从文件中插入数据,我怀疑它是否适合您的场景。

【讨论】:

  • OPENXML 是在 SQL Server 2000 中分解 XML 的方法,但是在 2005 年及以后的版本中,更倾向于使用 XML 方法(尤其是 .nodes())。
  • @RBarryYoung,请注意!虽然,我不是 Sql 专家,但有人告诉我 OPENXML 在批量数据方面更好(因此建议)。在谷歌上快速搜索会产生分歧的意见 - 如果你/其他人遮住一些光线,我会很高兴。一个这样的链接(文档或性能分析)会更好!
  • AFAIK,性能相似,但是 XML 方法更加灵活和强大。
  • 我看到了一个性能比较,其中性能相似(我现在找不到链接)。我认为问题在于内存使用和可伸缩性:“node() 和 value() 函数的组合有效地使用了 XML 索引。因此,这种组合可以表现出比 OpenXml 更大的可伸缩性。” msdn.microsoft.com/en-us/library/ms345115%28v=sql.90%29.aspx
猜你喜欢
  • 1970-01-01
  • 2011-04-24
  • 2017-12-25
  • 1970-01-01
  • 2012-03-16
  • 2020-07-19
  • 1970-01-01
  • 2011-08-22
  • 2014-09-04
相关资源
最近更新 更多