2

我一直在尝试创建一个存储过程,该存储过程使用动态 SQL 组装 bcp 命令以将数据从参数化存储过程导出到 csv 文件。

最初得到我认为是文件系统权限的主机数据文件访问问题。

现在,当我运行 proc 时,我始终会收到填充错误:

SQLState = S1010, NativeError = 0 错误 = [Microsoft][SQL Server Native Client 10.0]函数序列错误

proc代码如下:

ALTER PROCEDURE [dbo].[sp_MakeMarketingListExports] 
        @includeInService varchar(1) = NULL,
        @includeMLM varchar(1) = NULL,
        @includeQuoteNoodle varchar(1) = NULL,
        @netective varchar(1) = NULL,
        @cyberChex varchar(1) = NULL,
        @agentsAdvantage varchar(1) = NULL,
        @quoteNoodle varchar(1) = NULL,
        @mlmListSubscriber varchar(1) = NULL,
        @state varchar(10) = NULL,
        @mailerID varchar(10) = NULL,
        @filePath varchar(250)
AS
BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        DECLARE @command varchar(500);

        SET @command = 'bcp "exec InternalML..sp_SelectMarketingListMembers '
                                + '@includeInService = ' + COALESCE(@includeInService, 'NULL') + ', '
                                + '@includeMLM = ' + COALESCE(@includeMLM, 'NULL') + ', '
                                + '@includeQuoteNoodle = ' + COALESCE(@includeQuoteNoodle, 'NULL') + ', '
                                + '@netective = ' + COALESCE(@netective, 'NULL') + ', '
                                + '@cyberChex = ' + COALESCE(@cyberChex, 'NULL') + ', '
                                + '@agentsAdvantage = ' + COALESCE(@agentsAdvantage, 'NULL') + ', '
                                + '@quoteNoodle = ' + COALESCE(@quoteNoodle, 'NULL') + ', '
                                + '@mlmListSubscriber = ' + COALESCE(@mlmListSubscriber, 'NULL') + ', '
                                + '@state = ' + COALESCE(@state, 'NULL') + '"'
                                + ' queryout ' + COALESCE(@filePath, 'NULL')
                                + ' -c -T -S ' + @@servername

        SELECT @command;

        EXEC xp_cmdshell @command;
END

我使用 SELECT @command 来获取组装命令进行分析。

已包含 calle proc 的参数名称,因此命令如下:

bcp "exec InternalML..sp_SelectMarketingListMembers @includeInService = NULL, @includeMLM = NULL, @includeQuoteNoodle = NULL, @netective = NULL, @cyberChex = NULL, @agentsAdvantage = NULL, @quoteNoodle = NULL, @mlmListSubscriber = NULL, @state = NULL" queryout C:\temp\test.csv -c -T -S SPKD18

在没有参数名称的情况下也使用了相同的 Function sequnc 错误消息:

bcp "exec InternalML.dbo.sp_SelectMarketingListMembers NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @state = NULL" queryout "C:\\temp\test.csv" -c -T -S SPKD18

关于为什么这不起作用的任何见解?顺便说一句,我已经通过 proc 运行 bcp 并将其复制到具有相同结果的命令提示符下。问题是我在互联网上找不到太多关于这个错误的信息,可能是因为它太通用了。

我可以直接在 SSMS 查询窗口中使用参数成功运行 InternalML.dbo.sp_SelectMarketingListMembers proc,所以我很确定它与 bcp 有关。

谢谢您的帮助

4

2 回答 2

1

BCP 将执行以下操作来解析结果集的格式。你能告诉我们这个结果吗:

set fmtonly on 
    exec sp_SelectMarketingListMembers <your input params>;
set fmtonly off
于 2011-04-02T02:53:23.217 回答
0

正如 Nathan Skerl 所述,bcp 将设置fmtonly选项并运行查询,以便在实际运行查询以生成输出之前为输出构建模式。我遇到了一些副作用:

  1. 条件选择包含在 bcp 将尝试使用的输出模式中,因此在实际运行查询时会导致错误,并且
  2. 临时表 ( #table) 并未实际创建,因此在查询中引用时会导致fmtonly-ed 运行失败。
于 2011-12-05T00:36:55.233 回答