除非手动运行,否则SQL Update无法在存储过程中运行

时间:2017-04-07 21:33:40

标签: sql-server tsql

以下是我在MSSQL(a.k.a.db)上运行的存储过程(a.k.a. sp)的片段。 sp用于从db视图获取数据,并通过BCP将结果导出为CSV文件。这没有问题。最后一步是使用当前时间戳更新db表从中获取数据的db表。现在,这是我的问题。当我通过MS SQL Server Management Studio手动运行存储过程时,所有操作都按计划进行。当通过软件从外部执行相同的sp时,BCP导出工作但更新表不起作用,即表中没有当前时间戳条目。声明,变量集,SET ANSI_NULLS ON和SET QUOTED_IDENTIFIER ON都在此片段之前就绪。

建议?

简略

IF EXISTS (SELECT * FROM DTicket WHERE FormID = @FormID)

BEGIN

   SELECT @csvdata = 'SELECT * FROM DTicket WHERE FormID = '''+@FormID+''''

   SELECT @bcpsql ='bcp "'+ @csvdata + '" queryout "'+ @filepath + @filename + '" -c -t"|" -U '+@user+' -P '+@pw+' -S '+ @server +' -d MainDB'

   EXEC master..xp_cmdshell @bcpsql

   UPDATE "udTicket" SET ExportDate = GetDate() WHERE  FormID = @FormID AND ExportDate IS NULL

END

1 个答案:

答案 0 :(得分:0)

看看下面的文章 https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/xp-cmdshell-transact-sql 似乎在bcp完成之前你的更新正在进行。 从xp_cmdshell中捕获返回值,如下例所示

declare @rtn int

exec @rtn =EXEC master..xp_cmdshell @bcpsql
if @rtn = 0
begin
UPDATE "udTicket" SET ExportDate = GetDate() WHERE  FormID = @FormID AND ExportDate IS NULL

end
 else .....