[英]Export XML column rows from SQL table into individual files
我有一個稱為REFERENCES
的表,其中包含數十萬行XML,我希望將其提取為單個XML文件。
它的格式大致如下:
+--------------+------------------+
| REFERENCE_ID | REFERENCE_XML |
+--------------+------------------+
| 1 | <xml>...</xml> |
| 2 | <xml>...</xml> |
| 3 | <xml>...</xml> |
| 4 | <xml>...</xml> |
| ... | <xml>...</xml> |
| 70000 | <xml>...</xml> |
+--------------+------------------+
我想遍歷每一行並批量導出每個REFERENCE_XML
列,並將其命名為REFERENCE_ID
。
我的輸出文件夾集如下所示:
C:\References\1.xml
C:\References\2.xml
C:\References\3.xml
C:\References\4.xml
C:\References\...
C:\References\70000.xml
我能夠找到對單個靜態行執行該操作的粗略查詢,但是我很難確定創建WHILE
循環或CURSOR
的最佳方法。 如何使文件名和WHERE
子句動態化,以遍歷REFERENCES
表中的每一行並將所有XML導出為單個文件?
DECLARE @fileName VARCHAR(MAX)
DECLARE @sqlStr VARCHAR(MAX)
DECLARE @sqlCmd VARCHAR(MAX)
SET @fileName = 'C:\References\1.xml' -- I need the integer value to be dynamic per row.
SET @sqlStr = SELECT REFERENCE_XML FROM REFERENCE_DB.dbo.REFERENCES WHERE REFERENCE_ID = 1' -- I need the REFERENCE_ID to be dynamic per row.
SET @sqlCmd = 'bcp "' + @sqlStr + '" queryout ' + @fileName + ' -w -T'
EXEC xp_cmdshell @sqlCmd
您可以在啟動CURSOR
直接使用ROW_NUMBER()
創建運行號碼。 這似乎比在任何迭代中調用完整的SELECT
容易。
編輯 :我要快。 您想將ReferenceID
用作數字。 不用ROW_NUMBER()
進行相同的操作,並在每次迭代時將ReferenceID讀入@Nr
。
Declare @YourTable table (ID int,SomeXml xml);
Insert Into @YourTable values
(100,'<root><test a="1"/></root>')
,(200,'<root><test a="2"/></root>')
,(300,'<root><test a="3"/></root>');
DECLARE @Nr BIGINT,@ID INT,@SomeXml XML;
DECLARE @fileName VARCHAR(MAX)
DECLARE @sqlStr VARCHAR(MAX)
DECLARE @sqlCmd VARCHAR(MAX)
DECLARE cur CURSOR FOR SELECT ROW_NUMBER() OVER(ORDER BY ID) AS Nr,ID,SomeXml FROM @YourTable ;
OPEN cur;
FETCH NEXT FROM cur INTO @Nr,@ID,@SomeXml;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = 'C:\YourPath\' + CAST(@Nr AS VARCHAR(100)) + '.xml' ;
SET @sqlStr = 'SELECT ''' + CAST(@SomeXml AS NVARCHAR(MAX)) + '''';
SET @sqlCmd = 'bcp "' + @sqlStr + '" queryout ' + @fileName + ' -w -T';
PRINT @sqlCmd;
--EXEC xp_cmdshell @sqlCmd
FETCH NEXT FROM cur INTO @Nr,@ID,@SomeXml;
END
CLOSE cur;
DEALLOCATE cur;
這是打印輸出:
bcp "SELECT '<root><test a="1"/></root>'" queryout C:\DVP\1.xml -w -T
bcp "SELECT '<root><test a="2"/></root>'" queryout C:\DVP\2.xml -w -T
bcp "SELECT '<root><test a="3"/></root>'" queryout C:\DVP\3.xml -w -T
我會做這樣的事情:
DECLARE @fileName VARCHAR(MAX)
DECLARE @sqlStr VARCHAR(MAX)
DECLARE @sqlCmd VARCHAR(MAX)
DECLARE @id int
DECLARE myCursor CURSOR FOR
SELECT REFERENCE_ID FROM REFERENCE_DB.dbo.REFERENCES
OPEN myCursor
FETCH NEXT FROM myCursor
INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = 'C:\References\' + @id + '.xml'
SET @sqlStr = SELECT REFERENCE_XML FROM REFERENCE_DB.dbo.REFERENCES WHERE REFERENCE_ID = ' + @id
SET @sqlCmd = 'bcp "' + @sqlStr + '" queryout ' + @fileName + ' -w -T'
EXEC xp_cmdshell @sqlCmd
END
CLOSE myCursor;
DEALLOCATE myCursor;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.