【问题标题】:SQL Server 2005 Xml Parameter Causing Timeout?SQL Server 2005 Xml 参数导致超时?
【发布时间】:2009-06-16 02:25:38
【问题描述】:

我试图在存储过程中发送大约 1MB 的 XML 作为 XML 参数,但连接总是返回超时。

谁知道 XML 类型的大小限制是多少?


环境:

  • Microsoft SQL Server 2005 Express
  • .NET Framework 2.0
  • C#

C#代码:

using (SqlCommand commandSave = new SqlCommand("SaveScanning", this.DatabaseConnection))
{
    commandSave.CommandType = System.Data.CommandType.StoredProcedure;

    SqlParameter scanningData = new SqlParameter("ScanningData", System.Data.SqlDbType.Xml);
    scanningData.Value = new SqlXml(new XmlTextReader(**HEREISTHEXMLSTRING**, XmlNodeType.Document, null));
    commandSave.Parameters.Add(scanningData);

    commandSave.ExecuteNonQuery();
}

SQL 代码:

CREATE PROCEDURE [dbo].[SaveScanning]
(
    @ScanningData XML
)
AS
BEGIN
    .
    .
    .

【问题讨论】:

  • 当传递一个较低的XML内容时,它可以正常工作。 (100kb)
  • 大小限制是 2gb 的二进制 xml,这通常比 xml 的文本表示更紧凑(例如,qnames 在二进制 xml 中被标记)
  • 我猜问题出在 SQL Server 上。当我尝试发送大 XML 并尝试从 SELECT 子句插入 TABLE 中的数据时,就会出现问题。当只使用 SELECT from XML 时,不会出现问题。

标签: xml sql-server-2005 parameters


【解决方案1】:

2 GB 是 XML 数据类型的最大大小。我已经用 20MB 的文本完成了 XML 参数,结果插入了 1000 行,这需要一个四 Xeon 框,平均 500 个用户 spid 和连接池,大约 25% 的 cpu,16 GB 的 ram 大约 10 秒。

编辑:

您对有问题的 SQL Select 使用了什么 XML 方法?

XQuery? XPath? 打开 XML?

如果你能提供更多的 T-SQL 会有所帮助。

【讨论】:

  • 这就是问题所在...我正在尝试从 XML 中的 Select 中插入 5000 条记录...超过 1000 条记录并且 SQL Server 返回超时...
  • 5000 条记录在 XML 文本中的大小是多少?我之前提到的 1000 条记录被放入一个包含大约 50 列的表中,该列由许多 varchar(50) 组成。如果您的 5000 条记录只有 5 列宽,那就没什么了。当我测试我的初始 XML 导入时,我记得测试了多达 20,000 条超过 400MB 的 xml 文本和 IIRC 记录,大约需要 2.5-3 分钟才能完成。
【解决方案2】:

超时意味着查询时间过长,而不是参数太大。

当然,您的查询可能需要太长时间因为参数太大。在 SQL Server Management Studio 中尝试使用相同参数的相同查询(下载 Express 版本)。

【讨论】:

  • 我在 SQL Server Management Studio 中试过了,整个过程只用了 2 秒...
【解决方案3】:

终于找到了解决办法:

读取 XML 的 OPENXML“函数”是迄今为止最好的方法。

CREATE PROCEDURE InsertXMLData
(
    @XMLDoc XML
)
AS

更快的方式:

DECLARE @handle INT

EXEC sp_xml_preparedocument @handle OUTPUT, @XMLDoc

INSERT INTO TestTable
SELECT * FROM OPENXML (@handle, '/authors', 2) WITH 
  (au_id INT,
   au_lname VARCHAR(20),
   au_fname VARCHAR(20)
  )
EXEC sp_xml_removedocument @handle

非常慢的方式:

INSERT INTO TestTable
SELECT
    x.item.value('@au_id', 'INT') AS au_id,
    x.item.value('@au_lname', 'VARCHAR(20)') AS au_lname
    x.item.value('@au_fname', 'VARCHAR(20)') AS au_fname
FROM
    @XMLDoc.nodes('/authors') x(item)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多