我正在尝试在下面的查询中使用带有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
答案 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的示例,该示例仅供公司参考,但希望这会为您指明正确的方向。
存储过程用于跟踪表上的更改。如果您需要更多帮助,我可以发布表格式以及如何创建记录表更改的触发器。反正很方便。