【发布时间】:2016-06-22 11:50:14
【问题描述】:
SELECT
ref.value('tablename[1]','nvarchar(500)') AS tablename,
ref.value('refTable[1]','nvarchar(500)') AS refTable,
ref.value('refTableIDColumn[1]','nvarchar(500)') AS refTableIDColumn
FROM
@XMLdata.nodes('''//Table[@name="'+ @DataItem +'"]''') AS R(ref)
这是我试图从 XML 文件中获取节点的代码,它将满足表名 @DataItem。我不断收到以下错误
XML 数据类型方法“nodes”的参数 1 必须是字符串字面量。
这是我的 XML 结构
<Table name="abc">
<tablename>abc1</tablename>
<refTable>abc2</refTable>
<refTableIDColumn>abc2ID</refTableIDColumn>
</Table>
我想获取所有以@dataItem 为 abc 的节点。请帮忙。
以下是我的更正
;WITH XmlData AS
(
SELECT
TableNameAttribute = ref.value('@name', 'nvarchar(500)'),
TableName = ref.value('tablename[1]', 'nvarchar(500)'),
RefTable = ref.value('refTable[1]', 'nvarchar(500)'),
RefTableIdColumn = ref.value('refTableIDColumn[1]', 'nvarchar(500)')
FROM
@XMLdata.nodes('/Table') AS R(ref)
)
--select * from XmlData;
INSERT INTO #TablesList
SELECT
TableName, RefTable, RefTableIdColumn
FROM
XmlData
WHERE
XmlData.TableNameAttribute = @DataItem
select * from #TablesList;
在最后一行之后我得到空白表。
【问题讨论】:
-
错误说明了一切:
.nodes()调用的参数必须是 字符串文字 - 不是变量,也不是与参数的连接 - 只是一个普通的,旧字符串 literal(单引号中的字符串) -
但我将动态地获得价值。我不能把它静态化。如何解决它
-
@user2998990 我正在通过您的查询获取数据,并且临时表不为空...那有什么问题?
-
SELECT 本身(没有
INSERT INTO)是否工作并提供正确答案?然后我会说你的临时表已经有一个空白条目或什么的...... -
如果单独使用
SELECT不起作用,那么您可能并没有真正向我们展示您拥有的 XML,并且有关该 XML 的某些内容会导致查询失败...
标签: sql-server xmlnode