SQL Server 2000 雖支援 FOR XML 輸出,但**缺乏直接讀取 XML 檔案的內建函數**。OPENXML 需要已載入記憶體的 XML 文本,而 OPENROWSET 的 Bulk 選項在 2000 版不支援 XML。本文提供「檔案 → 變數 → 記憶體文件 → OPENXML」完整鏈路。
xp_cmdshell 'type C:\Path\File.xml' 逐行讀入暫存表,串接成單一 VARCHAR(8000) / TEXT 變數。sp_xml_preparedocument @hDoc OUTPUT, @XmlText。SELECT * FROM OPENXML(@hDoc, '/Root/Row', 2) WITH (Col1 INT, Col2 VARCHAR(50) ...)。sp_xml_removedocument @hDoc。DECLARE @FileName VARCHAR(255) = 'C:\Data\Orders.xml';
DECLARE @ExecCmd VARCHAR(255) = 'type ' + @FileName;
DECLARE @XmlText VARCHAR(8000) = '';
DECLARE @hDoc INT;
-- 1. 讀取檔案
CREATE TABLE #tmp (Line VARCHAR(255));
INSERT INTO #tmp EXEC master.dbo.xp_cmdshell @ExecCmd;
DECLARE @Line VARCHAR(255), @RowCount INT = 0;
SELECT @RowCount = COUNT(*) FROM #tmp WHERE Line IS NOT NULL AND Line <> 'NULL';
DECLARE cur CURSOR FAST_FORWARD FOR
SELECT Line FROM #tmp WHERE Line IS NOT NULL AND Line <> 'NULL';
OPEN cur;
FETCH NEXT FROM cur INTO @Line;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @XmlText = @XmlText + @Line;
FETCH NEXT FROM cur INTO @Line;
END
CLOSE cur; DEALLOCATE cur;
DROP TABLE #tmp;
-- 2. 準備文件
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XmlText;
-- 3. 查詢解析 (假設 XML 結構: ... )
SELECT OrderID, CustID
FROM OPENXML(@hDoc, '/Orders/Order', 1) -- flags=1: attribute-centric
WITH (
OrderID INT '@OrderID',
CustID VARCHAR(10) '@CustID'
);
-- 4. 釋放
EXEC sp_xml_removedocument @hDoc;
| 元件 | 說明 | 注意事項 |
|---|---|---|
xp_cmdshell | 需啟用 sp_configure 'xp_cmdshell', 1;受限於服務帳戶檔案系統權限 | 安全性風險大,生產環境建議改用 CLR/SSIS |
sp_xml_preparedocument | 將 XML 解析為 DOM 樹狀結構於記憶體,回傳控制代碼 | 大 XML 會消耗大量記憶體,用畢必須 sp_xml_removedocument |
OPENXML flags | 1=屬性導向, 2=元素導向, 3=混合 | 需與 XML 結構匹配,否則回傳 NULL |
WITH 子句 | 定義結果集結構:欄位名、型別、XPath 對應 | 欄位名加 @ 表示屬性,不加表示子元素 |
TEXT / NTEXT 變數或直接將 xp_cmdshell 結果 INSERT INTO #tmp EXEC ... 後用 TEXTPTR + UPDATETEXT 組裝(複雜)。File.ReadAllText + XmlDocument.LoadXml 高效安全。DECLARE @Ns VARCHAR(255) = '';
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XmlText, @Ns;
SELECT * FROM OPENXML(@hDoc, '/ns1:Root/ns1:Row', 2) WITH (...);
SQL Server 2000 讀取 XML 檔案需組合 xp_cmdshell、sp_xml_preparedocument、OPENXML 三大組件。雖可行但維護成本高、安全性弱、記憶體壓力大。**現代專案強烈建議升級至 SQL 2005+ 使用原生 XML 型別、SQLCLR 或 SSIS**,徹底解決檔案讀取與解析難題。