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



我正在尝试在下面的查询中使用带有 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

我目前使用了一个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示例作为其公司特定,但希望这将带您朝着正确的方向前进。

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

最新更新