【问题标题】:Return BCP Output as a message from SQL Server 2012 (read by MATLAB)从 SQL Server 2012 返回 BCP 输出作为消息(由 MATLAB 读取)
【发布时间】:2013-11-07 18:17:58
【问题描述】:

我在存储过程中创建了一个表,使用 BCP 导出其内容,然后删除该表。 BCP 命令如下:

SET @sqlop = 'BCP "SELECT blah FROM MYTABLE" queryout "' + @txt4print* 
             + '" -b 50000 -c -t"," -S"server" -U"uname" -P"pswd"'
exec master..xp_cmdshell @sqlop       --, NO_OUTPUT

通常,如果存储过程中出现错误,则会在 SQL Server 中将其打印为Message。但是,BCP 的输出不会作为消息打印。所以我无法在 MATLAB 中捕获错误实例。有没有办法捕获字符串error,如下所示?此输出是否可以从 SQL Server 作为Message 返回?

我不是高级 SQL 程序员。谢谢!

【问题讨论】:

    标签: sql sql-server matlab error-handling bcp


    【解决方案1】:

    你在这里有输出,所以你应该能够捕获该输出,然后手动从中强制出错。

    DECLARE @Output TABLE (OutputMessage NVARCHAR(4000));
    
    SET @sqlop = 'BCP "SELECT blah FROM MYTABLE" queryout "' + @txt4print* 
                 + '" -b 50000 -c -t"," -S"server" -U"uname" -P"pswd"'
    
    INSERT INTO @Output
    exec master..xp_cmdshell @sqlop       --, NO_OUTPUT
    
    DELETE FROM @Output WHERE OutputMessage IS NULL
    
    DECLARE @Statement NVARCHAR(MAX)
    
    WHILE (SELECT COUNT(*) FROM @Output) > 0
    BEGIN
        SELECT TOP 1 @Statement = OutputMessage FROM @Output
        IF @Statement LIKE '%Error%'
        BEGIN
          SET @Statement = 'Unexpected error in procedure: ' + @Statement
          RAISERROR(@Statement, 16, 1)
        END
    END
    

    或者,如果您只想要一条消息而不是错误,您应该能够使用 PRINT 获得类似的效果。

    http://technet.microsoft.com/en-us/library/ms176047.aspx

    【讨论】:

    • 谢谢大卫。您的解决方案对我很有用。我可以做的另一个选择是简单地将输出错误消息作为cellarray 检索到 Matlab 中。
    • @Maddy 抱歉,我根本不知道 matlab,只知道 SQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 2018-10-24
    • 2021-07-01
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多