Динамический индекс с путем XML - SQL Server - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь использовать динамический индекс с XML-путем в запросе ниже, но он не работает. Проблема в том, как передать переменную с OPENXML(@hDoc, 'Department/dept[@i]') ...

declare @i int =1;

DECLARE @hDoc AS INT, @SQL NVARCHAR (MAX)
EXEC sp_xml_preparedocument @hDoc OUTPUT, @MBL

SELECT A, B, C, D
FROM OPENXML(@hDoc, 'Department/dept[@i]')
WITH (A [varchar](1000) 'Employees/Employee/@user',
      B [varchar](1000) 'Employees/Employee/@name',
      C [varchar](1000) 'Employees/Employee/@id',
      D [varchar](1000) 'Employees/Employee/@date')

EXEC sp_xml_removedocument @hDoc
GO

1 Ответ

0 голосов
/ 03 июля 2018

У меня есть PROC, который я сейчас использую, который открывает строки XML и выводит некоторую информацию на основе параметра имени поля. Я нашел единственный способ сделать это через динамический SQL. Не самое лучшее решение, но может помочь вам. Это другая техника для чтения XML, поэтому потребует некоторой доработки, но это может дать вам другой вариант.

CREATE PROC [dba].[CheckChangeLog]
    @TableName NVARCHAR(255) = 'dbo.OrderedItems'
,   @RowID NVARCHAR(255) = ''
,   @Fieldname NVARCHAR(255) = ''
AS
    BEGIN
        DECLARE @strSQL AS NVARCHAR(MAX)

        SET @strSQL = '
            SELECT  ChangeLog.ID
            ,       ChangeLog.TableName
            ,       ChangeLog.Deleted
            ,       ChangeLog.Inserted
            ,       ChangeLog.DateTime
            ,       d.value(''(./' + @Fieldname + ')[1]'', ''NVARCHAR(4000)'') AS FieldFrom
            ,       i.value(''(./' + @Fieldname + ')[1]'', ''NVARCHAR(4000)'') AS FieldTo
            FROM    dba.ChangeLog WITH (NOLOCK)
            OUTER APPLY Inserted.nodes(''/row'') Ins (i)
            OUTER APPLY Deleted.nodes(''/row'') Del (d)
            WHERE   TableName = @TableName
                    AND (inserted IS NOT NULL
                            OR deleted IS NOT NULL
                        )
                    AND (i.value(''@id'', ''NVARCHAR(4000)'') = @RowID
                            OR i.value(''@id'', ''NVARCHAR(4000)'') IS NULL
                        )
                    AND (d.value(''@id'', ''NVARCHAR(4000)'') = @RowID
                            OR d.value(''@id'', ''NVARCHAR(4000)'') IS NULL
                        )
            ORDER BY ID
'

        EXEC sp_executesql
            @strSQL
        ,   N'@TableName NVARCHAR(255), @RowID NVARCHAR(255)'
        ,   @TableName
        ,   @RowID

    END

Я не могу публиковать примеры XML, из которого он читает, как специфическую для компании, но, надеюсь, это приведет вас в правильном направлении.

Хранимая процедура используется для отслеживания изменений в таблице. Если вам нужна дополнительная помощь по этому вопросу, я могу опубликовать формат таблицы и узнать, как создать триггер, который регистрирует изменения таблицы. В любом случае это очень удобно.

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