我想通过动态传递节点名来获取节点的值。
我正在使用以下xml:
DECLARE @xml AS XML = '<AuditMsg>
<SourceDb>TestDatabase</SourceDb>
<SourceTable>Person</SourceTable>
<PKFieldName>ID</PKFieldName>
<UserId>sa</UserId>
<DMLType>I</DMLType>
<OldData />
<ChangedData>
<t xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ID>4</ID>
<FirstName>name 4</FirstName>
<LastName>surname 4</LastName>
<DateOfBirth>444444</DateOfBirth>
</t>
</ChangedData>
</AuditMsg>'
INSERT INTO @changed
SELECT
changed.col.value('local-name(.)', 'VARCHAR(100)') AS Name,
changed.col.value('.[1]', 'VARCHAR(14)') AS Value,
ROW_NUMBER() OVER (PARTITION BY changed.col.value('local-name(.)', 'VARCHAR(100)') ORDER BY (SELECT 0)) AS RecordId,
changed.col.value('(/t/ID)[1]', 'INT') AS ApplicationID
FROM
@ChangedData CD
CROSS APPLY
CD.ChangedData.nodes('/t/*') AS changed(col)
在第6行,我静态地传递节点名作为id。我想动态地传递节点名,我正在尝试这样做
DECLARE @Attribute varchar(100) = 'ID'
INSERT INTO @changed
SELECT
changed.col.value('local-name(.)', 'VARCHAR(100)') AS Name,
changed.col.value('.[1]', 'VARCHAR(14)') AS Value,
ROW_NUMBER() OVER (PARTITION BY changed.col.value('local-name(.)', 'VARCHAR(100)') ORDER BY (SELECT 0)) AS RecordId,
changed.col.value('(/t/' + @Attribute +')[1]', 'INT') AS ApplicationID
FROM
@ChangedData CD
CROSS APPLY
CD.ChangedData.nodes('/t/*') AS changed(col)
通过动态传递节点名,我得到了这个错误(xml数据类型方法“value”的参数1必须是字符串文本)
我怎样才能做到这一点?
1条答案
按热度按时间6kkfgxo01#
你在找什么东西吗?
--外部定义的变量
--查询
xpath将深入到
<t>
然后找到元素,其中元素的名称等于通过sql:variable()
. 在这个元素中,我们选择text()
节点。