以下是我在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
答案 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 .....