从 SQL Server 读取 XML
Posted
技术标签:
【中文标题】从 SQL Server 读取 XML【英文标题】:Read XML from SQL Server 【发布时间】: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 的某些内容会导致查询失败...
【参考方案1】:
您不能在 .nodes()
调用中使用字符串连接或变量 - 只能字符串文字。
您可以做的是这样的事情 - 解析 CTE 中的数据,然后根据您的 @dataitem
从该 CTE 中进行选择:
-- create a CTE to extract the data from the XML
;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
@XmlInput.nodes('/Table') AS R(ref)
)
-- now select from that CTE only those rows you want
SELECT
TableName, RefTable, RefTableIdColumn
FROM
XmlData
WHERE
XmlData.TableNameAttribute = @dataitem
【讨论】:
我使用了这个,从我插入的表中选择后,我得到了空白表。以上是关于从 SQL Server 读取 XML的主要内容,如果未能解决你的问题,请参考以下文章
如何读取 FOR XML SQL Server 查询的完整结果?
读取 XML 数据并构建查询以将值插入 SQL Server DB 的最佳方法是啥?
如何使用 docbase Root 从 server.xml 读取上下文参数