1

我想通过动态传递节点名称来获取节点的值。

我正在使用这个 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 数据类型方法“值”的参数 1 必须是字符串文字)

我怎样才能做到这一点?

4

1 回答 1

1

你在寻找这方面的东西吗?

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>'

--你的外部定义变量

DECLARE @Attribute varchar(100) = 'ID'

--查询

SELECT @xml.value('(/AuditMsg
                    /ChangedData
                    /t
                    /*[local-name()=sql:variable("@Attribute")]
                    /text())[1]','nvarchar(max)');

XPath 将深入<t>并找到元素,其中元素的名称等于您传入的参数 via sql:variable()。在这个元素中,我们选择text()节点。

于 2020-06-05T10:52:52.820 回答