最近需要把資料導成XML,不想通過編程實現,手工使用匯入匯出工具又覺得麻煩,想想還是寫SQL語句啟動並執行好,以後擴充也方便,但Microsoft好像並沒有提供什麼SQL語句可以直接匯出方法,用bcp匯出的都是文本、EXCEL或其他什麼的,本來以為可以把查詢結果通過bcp匯出文本的形式,但經過N次實驗,匯出的XML不知道為什麼都會自動換行,一開啟就會報錯,百思不得其解,而且匯出的XML沒有一個<Root>,這也是個麻煩事。
首先要做的準備工作是啟用SQL中master資料庫中的系統擴充預存程序[master].sys.xp_cmdshell。通過如下方法開啟此預存程序:
-- 允許配置進階選項EXEC sp_configure 'show advanced options', 1GO-- 重新設定RECONFIGUREGO-- 啟用xp_cmdshellEXEC sp_configure 'xp_cmdshell', 1GO--重新設定RECONFIGUREGO--執行想要的xp_cmdshell語句Exec xp_cmdshell 'query user'GO--用完後,要記得將xp_cmdshell禁用(從安全形度安全考慮)-- 允許配置進階選項EXEC sp_configure 'show advanced options', 1GO-- 重新設定RECONFIGUREGO-- 禁用xp_cmdshellEXEC sp_configure 'xp_cmdshell', 1GO--重新設定RECONFIGUREGO
另外關於 xp_cmdshell 預存程序的介紹可以去參考一下另一篇文章:xp_cmdshell預存程序
最關鍵的就是這兩個問題:1.如何使用XML不自動換行;2.如何增加一個<Root>標籤;
查看了N篇與其相關的線上說明,一個xml的資料類型提醒了我,覺得可以把查詢結果做為一個變數儲存後再匯出,通過串連一個視圖來增加<Root>標籤,以下是範例代碼:
USE testGO--建立一個表CREATE TABLE test_blan(x VARCHAR(100),y VARCHAR(100))GO--插入資料INSERT INTO test_blan SELECT 'a','a' UNION ALLSELECT 's','s' UNION ALLSELECT 'd','d' UNION ALLSELECT 'f','f' UNION ALLSELECT 'g','g' UNION ALLSELECT 'q','q' UNION ALLSELECT 'w','w' UNION ALLSELECT 'e','e' UNION ALLSELECT 'r','r' UNION ALLSELECT 't','t' UNION ALLSELECT 'y','y' --建立一個視圖用於增加<Root>標籤CREATE VIEW test_log AS SELECT 'root' aaaa --建立一個表用於儲存產生的XML結果CREATE TABLE TT(aa XML )--定義一個XML的變數DECLARE @x XML--查詢產生XML結果並儲存到TT表中SET @x = (SELECT * FROM test_log IRoot,test_blan IData FOR XML AUTO) INSERT TT VALUES (@x)
-- 先將原先的123.xml檔案刪除exec master.dbo.xp_cmdshell 'del E:\123.xml'--通過bcp將TT中的XML結果輸出EXEC [master].sys.xp_cmdshell 'bcp Test.dbo.TT out E:/123.xml -c -T -k'--刪除表及視圖DROP TABLE TT DROP VIEW Test_Log
這樣匯出的XML就是個完整的檔案了。。。