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;
在最后一行之后我得到空白表。
答案 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