SQL Server 2005 Xml-параметр вызывает тайм-аут? - PullRequest
0 голосов
/ 16 июня 2009

Я пытаюсь отправить XML размером примерно 1 МБ в качестве параметра 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
    .
    .
    .

Ответы [ 3 ]

1 голос
/ 17 июня 2009

2 ГБ - максимальный размер для типа данных XML. Я выполнил XML-параметры с объемом текста 20 МБ, в результате чего было вставлено 1000 строк, и для этого требуется квадро-ксеон, который в среднем составляет 500 пользовательских спидов с пулом соединений, который занимает около 25% ЦП, с 16 ГБ оперативной памяти около 10 секунд.

Edit:

Какой метод XML вы используете с SQL Select, в котором возникла проблема?

XQuery? XPath? Открыть XML?

Если бы вы могли предоставить больше вашего T-SQL, это помогло бы.

0 голосов
/ 19 июня 2009

Наконец я нашел решение:

«Функция» 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 голосов
/ 16 июня 2009

Тайм-аут означает, что запрос занимает слишком много времени, но не слишком большой параметр.

Конечно, возможно, ваш запрос занимает слишком много времени , потому что параметр слишком велик. Попробуйте выполнить тот же запрос с тем же параметром в SQL Server Management Studio (загрузить версию для Express).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...