【问题标题】:bcp xml not exporting all rows to individual filesbcp xml 未将所有行导出到单个文件
【发布时间】:2017-05-10 14:48:56
【问题描述】:

我有一个 sql 查询,它将表的每个 XML 行导出到单个 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_'+@RN+'.xml"'
SET @bcpcmd = 'BCP "SELECT [XML] from [x_rpt].[dbo].[x_abc] WHERE RN='+@RN+'" 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 @i=@i+1

END

【问题讨论】:

    标签: sql xml export bcp


    【解决方案1】:

    尝试使用基于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
    

    调整路径和数据库/架构/表/列名...

    【讨论】:

    • 这个问题解决了吗?说谢谢 非常好,但如果你在(最佳)答案的投票计数器下方勾选接受检查,那就更好了。这将 1) 将此问题标记为已解决 2) 让追随者更容易找到最佳解决方案 3) 向回答者支付积分和 4) 向您支付积分。一旦您自己越过了 15 点边界,您还被要求对贡献进行投票。这是说谢谢的方式。编码快乐!
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多