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
答案 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
变量的值。