我正在尝试在存储过程中发送大约1MB的XML作为XML参数,但总是连接返回超时。
任何人都知道XML类型的大小限制是什么?
环境:
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
.
.
.
答案 0 :(得分:1)
2 GB是XML数据类型的最大大小。我已经完成了XML参数,其中包含20MB的文本,导致插入1000行,这需要一个四分之一的Xeon盒,平均500个用户spid w /连接池,大约25%cpu,16 GB内存大约10秒。
编辑:
您使用哪种XML方法使用SQL Select有问题?
的XQuery? XPath的? 打开XML?
如果您可以提供更多的T-SQL,那将会有所帮助。
答案 1 :(得分:0)
超时意味着查询耗时太长,而不是参数太大。
当然,您的查询可能需要太长时间,因为参数太大。在SQL Server Management Studio中尝试使用相同参数的相同查询(下载Express版本)。
答案 2 :(得分:0)
最后我找到了解决方案:
OPENXML“函数”读取XML是迄今为止最好的方法。
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)