2017-05-10 28 views
0

我有一個sql查詢可將每個XML行的表格導出到單個XML文件。該過程完美工作,除了停止並且不會一次處理所有行。我必須更改行號以從停止的位置開始。它將使用此過程處理沒有錯誤的所有行,但是我寧願它一次處理所有行。 這是我的查詢:bcp xml不會將所有行導出到單個文件

DECLARE 
@FILENAME VARCHAR(500), 
@bcpcmd VARCHAR(2000), 
@RN VARCHAR(10), 
@i int; 
DECLARE @Table table (RN int, IsDone char(1)) 
INSERT @Table SELECT RN, 0 FROM [x_rpt].[dbo].[x_abc] WHERE RN>=1 --this is where I update RN to process records where it leaves off-- 
SET @i=0 
WHILE @i<= (SELECT COUNT(*) FROM @Table WHERE IsDone = '0') 
BEGIN 
SELECT TOP 1 @RN=RN FROM @Table WHERE IsDone = 0 
SET @FILENAME = '"C:\temp\data\abc\Jan_2016_'[email protected]+'.xml"' 
SET @bcpcmd = 'BCP "SELECT [XML] from [x_rpt].[dbo].[x_abc] WHERE RN='[email protected]+'" queryout "' 
SET @bcpcmd = @bcpcmd + @FILENAME + '" -w -T -S "SERVER"' 

EXEC master..xp_cmdshell @bcpcmd 

UPDATE @Table set IsDone='1' where RN=convert(int,@RN) 
SET @[email protected]+1 

END 

回答

0

嘗試使用CURSOR基礎的方法:

CREATE TABLE SomeDB.dbo.MockUp(RN INT,[XML] XML); 
INSERT INTO SomeDB.dbo.MockUp VALUES 
(1,N'<test RN="1"/>') 
,(17,N'<test RN="17"/>') 
,(-300,N'<test RN="-300"/>'); 

DECLARE 
@FILENAME VARCHAR(500), 
@bcpcmd VARCHAR(2000), 
@rn INT; 
DECLARE c CURSOR FOR SELECT RN FROM SomeDB.dbo.MockUp 
OPEN c; 
FETCH NEXT FROM c INTO @rn; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @FILENAME = '"C:\SomePath\Jan_2016_'+CAST(@rn AS VARCHAR(MAX))+'.xml"' 
    SET @bcpcmd = 'BCP "SELECT [XML] from SomeDB.[dbo].MockUp WHERE RN='+CAST(@rn AS VARCHAR(MAX))+'" queryout "' 
    SET @bcpcmd = @bcpcmd + @FILENAME + '" -w -T -S ' + @@SERVERNAME 

    EXEC master..xp_cmdshell @bcpcmd  

    FETCH NEXT FROM c INTO @rn; 
END 

CLOSE c; 
DEALLOCATE c; 
GO 

DROP TABLE SomeDB.dbo.MockUp 

調整的路徑和數據庫/模式/表/列名...

+0

完美,謝謝,謝謝謝謝!!! – LRobinson

+0

這個問題解決了嗎?非常友善地說*謝謝*,但您甚至會更親切地在(最佳)答案的投票櫃檯下面打勾接受檢查。這將1)標記這個問題已解決2)使追隨者更容易找到最佳的解決方案3)支付點給回答者和4)支付點給你。一旦你自己超過了15分的邊界,你又被要求對貢獻進行投票。這是SO的方式來說聲謝謝。快樂編碼! – Shnugo

相關問題