Лучший подход, динамический OpenXML в T-SQL - PullRequest
0 голосов
/ 11 января 2010

Я храню значения XML для записи в моей базе данных. Первоначально я извлекаю тип данных xml в свою бизнес-логику, а затем заполняю данные XML в DataSet. Я хочу улучшить этот процесс, загрузив XML прямо в T-SQL. Вместо того, чтобы получить XML как строку, а затем преобразовать его в BL.

Моя проблема заключается в следующем: каждая запись XML является динамической, то есть это может быть любой столбец, созданный пользователем. Я попытался использовать этот подход, но он дает мне ошибку:

    CREATE PROCEDURE spXMLtoDataSet
    @id uniqueidentifier,
    @columns varchar(max)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @name varchar(300);
    DECLARE @i int;
    DECLARE @xmlData xml;
    (SELECT @xmlData = data, @name = name FROM XmlTABLES WHERE (tableID = ISNULL(@id, tableID)));

    EXEC sp_xml_preparedocument @i OUTPUT, @xmlData

    DECLARE @tag varchar(1000);
    SET @tag = '/NewDataSet/' + @name;
    DECLARE @statement varchar(max)
    SET @statement = 'SELECT * FROM OpenXML(@i, @tag, 2) WITH (' + @columns + ')';
    EXEC (@statement);

    EXEC sp_xml_removedocument @i
END

где я передаю динамически написанные @ столбцы.

Например:

spXMLtoDataSet 'bda32dd7-0439-4f97-bc96-50cdacbb1518', 'ID int, TypeOfAccident int, Major bit, Number_of_Persons int, Notes varchar(max)'

но это продолжало вызывать у меня это исключение:

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@i".
Msg 319, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'with'. If this statement is a common table expression or an xmlnamespaces clause, the previous statement must be terminated with a semicolon.

Ответы [ 2 ]

1 голос
/ 08 мая 2013

замените @statement на

SET @statement = 'DECLARE @i int;
DECLARE @xmlData xml;
(SELECT @xmlData = data, @name = name FROM XmlTABLES WHERE (tableID = ISNULL(@id, tableID)));
EXEC sp_xml_preparedocument @i OUTPUT, @xmlData
SELECT * FROM OpenXML(@i, @tag, 2) WITH (' + @columns + ')';
EXEC (@statement);
0 голосов
/ 11 января 2010

Ваши вызовы sp_xml_% ( оба из них) также должны быть динамическими, чтобы дескриптор @i распознавался

Конечно, это лучше в вашем клиентском коде, хотя?

Не по теме: а GUID PK тоже?

...