BCP queryout命令创建文本文件,但在事务中的作业步骤中执行时挂起

时间:2013-02-14 15:43:52

标签: sql tsql transactions jobs bcp

好吧,我已经和这个问题争吵了差不多一个星期了,我不能为我的生活找出问题所在。

问题: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

1 个答案:

答案 0 :(得分:3)

我想出了这个问题。

在事务处于打开状态时,我无法使用BCP实用程序。我必须提交交易,然后使用BCP。