即使我正在检查并删除临时表,在数据库错误消息中已经存在名为“#dirs”的对象

时间:2012-12-07 16:46:31

标签: sql tsql

我不确定为什么我一直在获取对象已经存在的消息,如果我正在检查该对象是否存在而且我正在丢弃它。有人有任何线索吗?

错误讯息:

Msg 2714,Level 16,State 1,Procedure spCreateDirectoryStructure,Line 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

2 个答案:

答案 0 :(得分:0)

编译存储过程时存在#dir。

只需删除该表,然后即可创建存储过程。

由于您仍在创建表,请考虑将其声明为局部变量:

declare @dirs table (directory varchar(200))

当局部变量超出范围时(存储过程退出时)将自动删除。然后您不必担心清理临时目录。

答案 1 :(得分:0)

你的问题是你有

         CREATE TABLE #dirs (Directory VARCHAR(200))

<强>上三次即可。在解析TSQL批处理时,SQL Server会看到第二个,并静态地确定它将在第二次存在。

我建议不要测试它,创建一次(在最顶层),而是在每次使用前将其清除以清除它。仅供参考,即使您在会话中有#dirs呼叫此SP,另一个将在SP的上下文中创建,并且它将在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