我有一个 50 行的 XML 文档保存在一个文本文件中。我想打开该文件并将内容输入 OPENXML。我是否缺少一些简单的解决方案?
阅读 SO 上的线程和 MS 上的 dox,到目前为止我发现的最简单的解决方案是:
DECLARE @file varchar(MAX) = 'mytest.xml'
DECLARE @xml varchar(MAX)
DECLARE @doc INT
SET @xml = (SELECT * FROM OPENROWSET(BULK 'my path', SINGLE BLOB) as DATA
EXEC sp_xml_preparedocument @doc OUTPUT, @xml
... and finally I can OPENXML
我什至不能在 OPENROWSET 中使用 @file,因为它抱怨它必须是字符串,而不是 varchar!
有什么办法可以简化这个吗?
请尝试以下概念解决方案。
值得注意的点:
Microsoft 专有的
OPENXML()
及其同伴 sp_xml_preparedocument
和 sp_xml_removedocument
保留只是为了向后兼容过时的 SQL
Server 2000。它们的使用减少到极少数边缘情况。
从 SQL Server 2005 开始,强烈建议重写 SQL 并将其切换为 XQuery。
此外,OPENXML()
无法利用 XML 索引,而 XQuery 方法可以。
books.xml
<books>
<book id="1">
<title>Book A</title>
<author>Jack Welch</author>
</book>
<book id="2">
<title>Book B</title>
<author>Henry Ford</author>
</book>
</books>
SQL
/*
Step #1: Load XML file into single row db table
*/
DECLARE @tbl TABLE (XMLColumn XML);
DECLARE @Filepath VARCHAR(100) = 'e:\Temp\books.xml';
DECLARE @sql NVARCHAR(MAX) =
N'SELECT BulkColumn
FROM Openrowset(Bulk N' + QUOTENAME(@Filepath, NCHAR(39)) + ', Single_Blob) x;';
PRINT @sql;
INSERT INTO @tbl (XMLColumn)
EXEC sys.sp_executesql @sql;
-- just to see
SELECT * FROM @tbl;
/*
Step #2: Shred XML without dynamic SQL
*/
--INSERT INTO <TARGET TABLE> -- uncomment when you are ready
SELECT c.value('@id', 'INT') AS id
, c.value('(title/text())[1]', 'NVARCHAR(50)') As title
, c.value('(author/text())[1]', 'NVARCHAR(50)') As author
FROM @tbl
CROSS APPLY XMLColumn.nodes('/books/book') AS t(c);