У меня есть 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, из которого он читает, как специфическую для компании, но, надеюсь, это приведет вас в правильном направлении.
Хранимая процедура используется для отслеживания изменений в таблице. Если вам нужна дополнительная помощь по этому вопросу, я могу опубликовать формат таблицы и узнать, как создать триггер, который регистрирует изменения таблицы. В любом случае это очень удобно.