0

オブジェクトが存在するかどうかをチェックしていて、存在する場合はドロップしている場合、オブジェクトが既に存在するというメッセージが表示され続ける理由がわかりません。誰にも手がかりはありますか?

エラーメッセージ:

メッセージ 2714、レベル 16、状態 1、プロシージャ spCreateDirectoryStructure、行 54 データベースには、'#dirs' という名前のオブジェクトが既に存在します。メッセージ 2714、レベル 16、状態 1、プロシージャ spCreateDirectoryStructure、行 74 データベースには、'#dirs' という名前のオブジェクトが既に存在します。

ストアド プロシージャ:

CREATE PROCEDURE spCreateDirectoryStructure
AS 
       BEGIN
             SET NOCOUNT ON;

             DECLARE @year CHAR(4)
             DECLARE @month VARCHAR(2)
             DECLARE @day VARCHAR(2)
             DECLARE @root VARCHAR(200)
             DECLARE @dir VARCHAR(200)
             DECLARE @yearDir VARCHAR(200)
             DECLARE @monthDir VARCHAR(200)
             DECLARE @dayDir VARCHAR(200)

             SET @root = 'C:\Test\'
             SET @year = DATEPART(YEAR, GETDATE())
             SET @month = DATEPART(MONTH, GETDATE())
             SET @day = DATEPART(DAY, GETDATE())
             SET @yearDir = @root + @year + '\'
             SET @monthDir = @root + @year + '\' + @month + '\'
             SET @dayDir = @root + @year + '\' + @month + '\' + @day + '\'

            -- check root folder for year folder
             IF OBJECT_ID(N'tempdb..#dirs') IS NOT NULL 
                BEGIN 
                      DROP TABLE #dirs
                END

             CREATE TABLE #dirs (Directory VARCHAR(200))

             INSERT INTO #dirs
                    EXEC master.dbo.xp_subdirs 
                        @root


             IF NOT EXISTS ( SELECT Directory
                             FROM   #dirs
                             WHERE  Directory = @year ) 
                EXEC master.sys.xp_create_subdir 
                    @yearDir

            -- **********************************************
            -- check year folder for month folder

             IF OBJECT_ID(N'tempdb..#dirs') IS NOT NULL 
                BEGIN
                      DROP TABLE #dirs
                END
             CREATE TABLE #dirs (Directory VARCHAR(200))

             INSERT INTO #dirs
                    EXEC master.dbo.xp_subdirs 
                        @yearDir


             IF NOT EXISTS ( SELECT Directory
                             FROM   #dirs
                             WHERE  Directory = @month ) 
                EXEC master.sys.xp_create_subdir 
                    @monthDir

            -- **********************************************
            -- check month folder for day folder

             IF OBJECT_ID(N'tempdb..#dirs') IS NOT NULL 
                BEGIN
                      DROP TABLE #dirs
                END
             CREATE TABLE #dirs (Directory VARCHAR(200))

             INSERT INTO #dirs
                    EXEC master.dbo.xp_subdirs 
                        @monthDir


             IF NOT EXISTS ( SELECT Directory
                             FROM   #dirs
                             WHERE  Directory = @day ) 
                EXEC master.sys.xp_create_subdir 
                    @dayDir
       END
GO
4

2 に答える 2

0

あなたの問題は、あなたが持っていることです

         CREATE TABLE #dirs (Directory VARCHAR(200))

三度。TSQL バッチを解析するとき、SQL Server は 2 番目のバッチを認識し、2 回目に存在すると静的に判断します。

私のアドバイスは、それをテストするのではなく、一度(一番上に)作成し、代わりに TRUNCATE して使用するたびにクリアすることです。参考までに、この SP を呼び出すセッションで #dirs があったとしても、SP のコンテキスト内で別の #dirs が作成され、SP の最後に範囲外になります。

CREATE PROCEDURE spCreateDirectoryStructure
AS 
             DECLARE @year CHAR(4)
             DECLARE @month VARCHAR(2)
             DECLARE @day VARCHAR(2)
             DECLARE @root VARCHAR(200)
             DECLARE @dir VARCHAR(200)
             DECLARE @yearDir VARCHAR(200)
             DECLARE @monthDir VARCHAR(200)
             DECLARE @dayDir VARCHAR(200)

             SET @root = 'C:\Test\'
             SET @year = DATEPART(YEAR, GETDATE())
             SET @month = DATEPART(MONTH, GETDATE())
             SET @day = DATEPART(DAY, GETDATE())
             SET @yearDir = @root + @year + '\'
             SET @monthDir = @root + @year + '\' + @month + '\'
             SET @dayDir = @root + @year + '\' + @month + '\' + @day + '\'

             CREATE TABLE #dirs (Directory VARCHAR(200))

             INSERT INTO #dirs
                    EXEC master.dbo.xp_subdirs 
                        @root


             IF NOT EXISTS ( SELECT Directory
                             FROM   #dirs
                             WHERE  Directory = @year ) 
                EXEC master.sys.xp_create_subdir 
                    @yearDir

            -- **********************************************
            -- check year folder for month folder

             TRUNCATE TABLE #dirs
             INSERT INTO #dirs
                    EXEC master.dbo.xp_subdirs 
                        @yearDir


             IF NOT EXISTS ( SELECT Directory
                             FROM   #dirs
                             WHERE  Directory = @month ) 
                EXEC master.sys.xp_create_subdir 
                    @monthDir

            -- **********************************************
            -- check month folder for day folder

             TRUNCATE TABLE #dirs
             INSERT INTO #dirs
                    EXEC master.dbo.xp_subdirs 
                        @monthDir


             IF NOT EXISTS ( SELECT Directory
                             FROM   #dirs
                             WHERE  Directory = @day ) 
                EXEC master.sys.xp_create_subdir 
                    @dayDir
GO
于 2012-12-07T17:03:13.937 に答える
0

#dirs は、ストアド プロシージャのコンパイル時に存在します。

テーブルを削除するだけで、ストアド プロシージャを作成できます。

とにかくテーブルを作成しているので、それをローカル変数として宣言することを検討してください。

declare @dirs table (directory varchar(200))

ローカル変数は、スコープ外になると (ストアド プロシージャが終了すると)、自動的に削除されます。その後、一時ディレクトリのクリーンアップについて心配する必要はありません。

于 2012-12-07T16:49:01.310 に答える