簡體   English   中英

將SQL列中的XML列行導出到單個文件中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM