如何将文本文件中XML内容导入OPENXML?是否有简化方案?
解决OPENROWSET无法使用变量加载XML文件的问题
方案1:动态SQL实现(适配OPENXML流程)
因为OPENROWSET(BULK)要求路径是常量字符串,用动态SQL拼接语句就能绕过这个限制,示例代码如下:
DECLARE @file NVARCHAR(MAX) = N'C:\你的文件路径\mytest.xml'; DECLARE @xml XML; DECLARE @doc INT; DECLARE @sql NVARCHAR(MAX); -- 用STRING_ESCAPE处理路径中的特殊字符,避免语法错误 SET @sql = N'SET @xml = (SELECT CAST(BULKCOLUMN AS XML) FROM OPENROWSET(BULK ''' + STRING_ESCAPE(@file, 'json') + N''', SINGLE_BLOB) AS DATA)'; -- 执行动态SQL并把XML内容赋值给变量 EXEC sp_executesql @sql, N'@xml XML OUTPUT', @xml OUTPUT; -- 继续你的OPENXML流程 EXEC sp_xml_preparedocument @doc OUTPUT, @xml; -- 这里写OPENXML查询逻辑,比如: -- SELECT * FROM OPENXML(@doc, '/根节点/子节点', 2) WITH (字段名 类型, ...) EXEC sp_xml_removedocument @doc;
方案2:直接用XML类型原生处理(更简洁)
如果不是必须用OPENXML,直接把文件内容转成XML类型后用XQuery查询,省去sp_xml_preparedocument这类步骤,代码更简洁高效:
DECLARE @file NVARCHAR(MAX) = N'C:\你的文件路径\mytest.xml'; DECLARE @xml XML; DECLARE @sql NVARCHAR(MAX); SET @sql = N'SET @xml = (SELECT CAST(BULKCOLUMN AS XML) FROM OPENROWSET(BULK ''' + STRING_ESCAPE(@file, 'json') + N''', SINGLE_BLOB) AS DATA)'; EXEC sp_executesql @sql, N'@xml XML OUTPUT', @xml OUTPUT; -- 直接用XQuery解析XML,示例获取指定节点数据 SELECT item.value('@id', 'INT') AS 项目ID, item.value('name[1]', 'NVARCHAR(100)') AS 项目名称 FROM @xml.nodes('/root/items/item') AS t(item);
内容的提问来源于stack exchange,提问作者Maury Markowitz
相关产品推荐
相关产品推荐

