好吧,我已经和这个问题争吵了差不多一个星期了,我不能为我的生活找出问题所在。
问题:BCP实用程序创建了txt文件,但之后没有任何反应。该文件就在那里并且是空白的。 BCP几乎挂了。我必须结束进程才能阻止它。 BCP命令位于作业步骤内的事务内部的存储过程中。如果我自己拿起sproc并在管理工作室中运行它,那么创建的文件没有问题。如果我创建一个SQL作业并把JUST运行BCP命令的sproc,它也可以工作。
这是工作步骤:
BEGIN TRANSACTION
BEGIN TRY
EXEC dbo.DataManipulation1
EXEC dbo.DataManipulation2
EXEC dbo.DataManipulation3
EXEC dbo.DataManipulation4
EXEC dbo.DataManipulation5
EXEC dbo.spCreateFiles 0
EXEC dbo.spSendEmail 'PASS'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
EXEC dbo.spGetDatabaseErrorInfo
EXEC dbo.spCreateFiles 1
EXEC dbo.spSendEmail 'FAIL'
END CATCH
这是spCreateFiles sproc。高级概述:Sproc生成系统文件夹,然后对txt文件进行查询。而已。如果传递给sproc的参数为0,它将根据sproc的执行生成文件,如果参数不为0,则它将生成空白文件。它总共有4个文件。出于显而易见的原因,删除了BCP命令的用户名和密码。从我的一些在线阅读中,可能是因为某些东西锁定了文件...可能是sproc或SQL作业甚至是转换,然后当BCP实用程序尝试使用它时,没有任何反应。
ALTER PROCEDURE [dbo].[spCreateFiles] @errorCode BIT
AS
BEGIN
BEGIN TRY
SET NOCOUNT ON;
DECLARE @year CHAR(4)
DECLARE @month CHAR(2)
DECLARE @day CHAR(2)
DECLARE @rootDir VARCHAR(200)
DECLARE @yearDir VARCHAR(200)
DECLARE @monthDir VARCHAR(200)
DECLARE @dayDir VARCHAR(200)
DECLARE @dirsTable TABLE (directory VARCHAR(200))
DECLARE @baseFileName VARCHAR(8)
DECLARE @detailFile VARCHAR(500)
DECLARE @detailNydFile VARCHAR(500)
DECLARE @summaryFile VARCHAR(500)
DECLARE @summaryNydFile VARCHAR(500)
DECLARE @cmdQueryout VARCHAR(2000)
SET @rootDir = 'C:\Test\'
SET @year = DATEPART(YEAR, GETDATE())
SET @month = RIGHT('00' + CONVERT(NVARCHAR(2), DATEPART(MONTH, GETDATE())), 2)
SET @day = RIGHT('00' + CONVERT(NVARCHAR(2), DATEPART(DAY, GETDATE())), 2)
SET @yearDir = @rootDir + @year + '\'
SET @monthDir = @rootDir + @year + '\' + @year + @month + '\'
SET @dayDir = @rootDir + @year + '\' + @year + @month + '\' + @year + @month + @day + '\'
SET @baseFileName = @year + @month + @day
PRINT @rootDir
PRINT @year
PRINT @month
PRINT @day
PRINT @yearDir
PRINT @monthDir
PRINT @dayDir
PRINT @baseFileName
INSERT INTO @dirsTable
EXEC master.dbo.xp_subdirs
@rootDir
IF NOT EXISTS ( SELECT directory
FROM @dirsTable
WHERE directory = @year )
EXEC master.sys.xp_create_subdir
@yearDir
DELETE FROM @dirsTable
INSERT INTO @dirsTable
EXEC master.dbo.xp_subdirs
@yearDir
IF NOT EXISTS ( SELECT directory
FROM @dirsTable
WHERE directory = @month )
EXEC master.sys.xp_create_subdir
@monthDir
DELETE FROM @dirsTable
INSERT INTO @dirsTable
EXEC master.dbo.xp_subdirs
@monthDir
IF NOT EXISTS ( SELECT directory
FROM @dirsTable
WHERE directory = @day )
EXEC master.sys.xp_create_subdir
@dayDir
DELETE FROM @dirsTable
SET @detailFile = @dayDir + @baseFileName + ' Detail.txt'
SET @detailNydFile = @dayDir + @baseFileName + ' Detail_NYD.txt'
SET @summaryFile = @dayDir + @baseFileName + ' Summary.txt'
SET @summaryNydFile = @dayDir + @baseFileName + ' Summary_NYD.txt'
PRINT @detailFile
PRINT @detailNydFile
PRINT @summaryFile
PRINT @summaryNydFile
IF @errorCode = 0
BEGIN
PRINT 'Error Code: ' + CAST(@errorCode AS CHAR(1))
SET @cmdQueryout = 'bcp "EXEC DB_NAME.dbo.spGetDetailRecords" queryout "' + @detailFile + '" -c -Uusername -Ppassword'
PRINT @cmdQueryout
EXEC master..xp_cmdshell
@cmdQueryout
SET @cmdQueryout = 'bcp "EXEC DB_NAME.dbo.spGetDetailNYDRecords" queryout "' + @detailNydFile + '" -c -Uusername -Ppassword'
PRINT @cmdQueryout
EXEC master..xp_cmdshell
@cmdQueryout
SET @cmdQueryout = 'bcp "EXEC DB_NAME.dbo.spGetSummaryRecords" queryout "' + @summaryFile + '" -c -Uusername -Ppassword'
PRINT @cmdQueryout
EXEC master..xp_cmdshell
@cmdQueryout
SET @cmdQueryout = 'bcp "EXEC DB_NAME.dbo.spGetSummaryNYDRecords" queryout "' + @summaryNydFile + '" -c -Uusername -Ppassword'
PRINT @cmdQueryout
EXEC master..xp_cmdshell
@cmdQueryout
END
ELSE
BEGIN
SET @cmdQueryout = 'bcp "SELECT NULL" queryout "' + @detailFile + '" -c -Uusername -Ppassword'
EXEC master..xp_cmdshell
@cmdQueryout
SET @cmdQueryout = 'bcp "SELECT NULL" queryout "' + @detailNydFile + '" -c -Uusername -Ppassword'
EXEC master..xp_cmdshell
@cmdQueryout
SET @cmdQueryout = 'bcp "SELECT NULL" queryout "' + @summaryFile + '" -c -Uusername -Ppassword'
EXEC master..xp_cmdshell
@cmdQueryout
SET @cmdQueryout = 'bcp "SELECT NULL" queryout "' + @summaryNydFile + '" -c -Uusername -Ppassword'
EXEC master..xp_cmdshell
@cmdQueryout
END
END TRY
BEGIN CATCH
EXEC dbo.spGetDatabaseErrorInfo
END CATCH
END
答案 0 :(得分:3)
我想出了这个问题。
在事务处于打开状态时,我无法使用BCP实用程序。我必须提交交易,然后使用BCP。