打开文本文件并使用 OPENXML 中的内容

问题描述 投票:0回答:1

我有一个 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!

有什么办法可以简化这个吗?

sql-server
1个回答
0
投票

请尝试以下概念解决方案。

值得注意的点:

  • 它使用指向文件上的 XML 文件的 T-SQL 变量 系统。
  • 速度非常快。

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);
© www.soinside.com 2019 - 2024. All rights reserved.