2009-06-16 62 views
0

我試圖發送一個約爲1MB的XML作爲存儲過程中的XML參數,但總是連接返回超時。SQL Server 2005 XML參數導致超時?

任何人都知道什麼是XML類型的大小限制?


環境:

  • 微軟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 
    . 
    . 
    . 
+0

當一個較低的XML內容傳遞,它工作正常。 (100kb) – Zanoni 2009-06-16 02:27:03

+0

大小限制是2GB的二進制XML,它通常比xml的文本表示更緊湊(例如,qnames在二進制XML中被標記化) – ahains 2009-06-16 05:13:25

+0

我想問題出在SQL Server上。當我試圖發送一個大的XML並嘗試從SELECT子句的TABLE中插入數據時,會出現問題。當只使用XML中的SELECT時,問題不會發生。 – Zanoni 2009-06-16 13:05:22

回答

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) 
0

超時指在查詢時間太長,沒有該參數是太大。

當然,您的查詢可能太長,因爲該參數太大。在SQL Server Management Studio中使用相同的參數嘗試相同的查詢(下載Express版本)。

1

2 GB是XML數據類型的最大大小。我已經完成了帶有20MB值的文本的XML參數,結果插入了1000行,並且這需要一個quad xeon框,平均500個用戶spid w /連接池,大約25%cpu,w/16 GB ram大約10秒。

編輯:

選擇是有問題的XML什麼方法你與你的SQL使用?

XQuery? XPath? 打開XML?

如果你可以提供更多的T-SQL,它會有所幫助。