从SQL Server读取XML

时间:2016-06-22 11:50:15

标签: sql-server xmlnode

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;

在最后一行之后我得到空白表。

1 个答案:

答案 0 :(得分: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