XML查询,变量不起作用

时间:2015-06-11 00:06:32

标签: sql sql-server xml tsql

declare @xml xml = 
'<ChangeSet DBSchemaVersion="2.0.0.88" DBSyncVersion="15" ScopeId="1">
  <C op="I" PK="44">
    <User UserId="44" Role="3" UserName="Dummy1" />
  </C>
  <C op="I" PK="45">
    <User UserId="45" Role="3" UserName="Dummy2" />
  </C>
  <C op="I" PK="46">
    <User UserId="46" Role="3" UserName="Dummy3" />
  </C>
</ChangeSet>'

-- this works fine
SELECT [SyncTable].Col.query('User')
         FROM @xml.nodes('/ChangeSet/C[@op=''I'']') as [SyncTable](Col)
         FOR XML AUTO

-- this does not work
DECLARE @tableName NVARCHAR(MAX) = 'User'
SELECT [SyncTable].Col.query('sql:variable(''@tableName'')')
         FROM @xml.nodes('/ChangeSet/C[@op=''I'']') as [SyncTable](Col)
         FOR XML AUTO

第一个回归:

<SyncTable><User UserId="44" Role="3" UserName="Dummy1"/></SyncTable><SyncTable><User UserId="45" Role="3" UserName="Dummy2"/></SyncTable><SyncTable><User UserId="46" Role="3" UserName="Dummy3"/></SyncTable>

第二个回归:

<SyncTable>User</SyncTable><SyncTable>User</SyncTable><SyncTable>User</SyncTable>

我正在尝试在表名是参数的过程中执行此操作。有没有办法做我想要实现的目标?
SQL Server 2008 R2

TIA

1 个答案:

答案 0 :(得分:0)

SQL变量值作为文字字符串传递给xquery表达式,而AFAICS无法将文字字符串作为xquery / xpath步骤表达式注入。

然而,有一种解决方法,即名称等于特定字符串的过滤元素。这里,特定字符串是来自SQL变量的文字字符串,例如:

DECLARE @tableName NVARCHAR(MAX) = 'User'
SELECT [SyncTable].Col.query('*[local-name()=sql:variable("@tableName")]')
         FROM @xml.nodes('/ChangeSet/C[@op="I"]') as [SyncTable](Col)
         FOR XML AUTO

<强> SQL Fiddle Demo

这部分*[local-name()=sql:variable("@tableName")]读取:选择当前上下文元素的任何子元素,local-name等于@tableName变量的值。