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

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

只需删除表,然后您就可以创建存储过程。

由于您无论如何都在创建表,请考虑将其声明为局部变量:

declare @dirs table (directory varchar(200))

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

于 2012-12-07T16:49:01.310 回答
0

你的问题是你有

         CREATE TABLE #dirs (Directory VARCHAR(200))

三次。在解析 TSQL 批处理时,SQL Server 看到第二个并静态确定它将在第二次左右存在。

我的建议是不要对其进行测试,创建一次(在最顶部),而是在每次使用前将其清除。仅供参考,即使您在调用此 SP 的会话中有一个#dirs,也会在 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
于 2012-12-07T17:03:13.937 回答