从 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 读取上下文参数

无法从具有多个 SQL Server 版本的 SQL Server 读取 Excel 文件

使用 Sql Server 从 C# 中的读取器读取数据

SQL Server AlwaysON 从多个辅助读取