具有XML路径的动态索引-SQL Server

时间:2018-07-03 08:48:22

标签: sql sql-server xml xsd

我正在尝试在下面的查询中使用带有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 :(得分:0)

此刻我使用一个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的示例,该示例仅供公司参考,但希望这会为您指明正确的方向。

存储过程用于跟踪表上的更改。如果您需要更多帮助,我可以发布表格式以及如何创建记录表更改的触发器。反正很方便。