Ошибка при использовании XML в хранимой процедуре (PDO + MS SQL 2008) - PullRequest
2 голосов
/ 31 марта 2011

Когда я использую SQL Profiler, я вижу все запросы, поступающие с сервера Debian, и могу выполнить их без каких-либо ошибок. Когда я выполняю SP из Apache / PHP + PDO, я получаю следующую ошибку:

SQLSTATE [HY000]: общая ошибка: 1934 Общая ошибка SQL Server: проверка сообщения от SQL Server [1934] (уровень серьезности 16) [(ноль)]

На самом деле ошибка не отображается должным образом. Настоящая ошибка должна выглядеть следующим образом:

Сообщение 1934 г., уровень 16, состояние 1, процедура CALCUL_NOTATION_XML2, строка 38 SELECT не удалось, потому что следующий SET параметры имеют неверные настройки: «CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING '. проверить что параметры SET являются правильными для использования с индексированными представлениями и / или индексами на вычисляемые столбцы и / или отфильтрованные индексы и / или уведомления о запросах и / или методы типа данных XML и / или операции с пространственным индексом.

Мой SP выглядит примерно так:

CREATE PROCEDURE dbo.TEST_XML(
    @MyXML XML
)
AS
BEGIN
    SET @MyXML = '<SampleXML>
    <Colors>
        <Color1>White</Color1>
    </Colors>
    <Fruits>
        <Fruits1>Apple</Fruits1>
    </Fruits>
    </SampleXML>'

    SELECT
    a.b.value('Colors[1]/Color1[1]','varchar(10)') AS Color1,
    a.b.value('Fruits[1]/Fruits1[1]','varchar(10)') AS Fruits1,
    FROM @MyXML.nodes('SampleXML') a(b) 
END

Ошибка возникает только из-за способа подключения PDO к базе данных. Используются следующие параметры:

-- network protocol: TCP/IP
set quoted_identifier off
set arithabort off
set numeric_roundabort off
set ansi_warnings off
set ansi_padding off
set concat_null_yields_null off
set ansi_nulls off
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed

Интересно, можно ли изменить настройку входа в систему в PDO, чтобы она выглядела примерно так:

set quoted_identifier on
set arithabort on
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language Français
set dateformat dmy
set datefirst 1
set transaction isolation level read committed

Я прочитал на сайте , своего рода обходной путь, но мне интересно, есть ли реальное решение (например, настройка PDO, я не знаю, как заставить его работать).

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