0

さて、私はこの問題とほぼ1週間戦ってきましたが、私は一生の間、問題が何であるかを理解することができません。

問題:BCPユーティリティはtxtファイルを作成しますが、その後何も起こりません。ファイルはそこにあり、空白です。BCPはほとんどハングします。プロセスを停止するには、プロセスを終了する必要があります。BCPコマンドは、ジョブステップ内のトランザクション内にあるストアドプロシージャ内にあります。sproc自体を取得して、Management Studioで実行すると、ファイルは問題なく作成されます。SQLジョブを作成し、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

これがspCreateFilessprocです。大まかな概要: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
4

1 に答える 1

4

私はその問題を理解しました。

トランザクションが開いている間はBCPユーティリティを使用できません。トランザクションをコミットしてから、BCPを使用する必要があります。

于 2013-06-27T17:22:06.633 に答える