我不确定为什么我一直在获取对象已经存在的消息,如果我正在检查该对象是否存在而且我正在丢弃它。有人有任何线索吗?
错误讯息:
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
答案 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