我第一次使用SqlServer,并且在我们的每一个创建过程脚本中都有一个代码块,如下所示,如果它已经存在,则删除该过程:
IF EXISTS (SELECT *
FROM information_schema.routines
WHERE routine_name = 'SomeProcedureName'
AND routine_type = 'PROCEDURE'
BEGIN
DROP PROCEDURE SomeProcedureName
END
//then the procedure definition
要停止在每个文件中剪切和粘贴此样板代码,我希望将此代码放在自己的存储过程中,以便脚本看起来像这样:
DropIfRequired('SomeProcedureName')
//then the procedure definition
我尝试解决方案是:
CREATE PROCEDURE DropIfRequired
(
@procedureName varchar
)
AS
IF EXISTS (SELECT * FROM information_schema.routines
WHERE routine_name = @procedureName
AND routine_type = 'PROCEDURE')
BEGIN
DROP PROCEDURE @procedureName
END
但是我得到以下错误:
Msg 102,Level 15,State 1,Procedure DeleteProcedure,Line 10 '@procedureName'附近的语法不正确。
任何想法如何做我想要的?
答案 0 :(得分:7)
完整的答案是:
DECLARE @SQL VARCHAR(8000) SELECT @SQL = 'USE ' + DB_NAME() + CHAR(10) SET @SQL = @SQL + 'DROP PROCEDURE ' + @procName --PRINT @SQL EXEC(@SQL)
安德鲁给出的那个只有在您的登录的默认数据库设置为您想要的数据库时才会起作用。使用动态sql时,您将获得一个新的数据库上下文。因此,如果您没有默认数据库集,则将从master执行命令。
答案 1 :(得分:4)
需要注意的一点是,在DropIfRequired过程中,您已按如下方式定义过程名称:
CREATE PROCEDURE DropIfRequired
(
@procedureName varchar
)
您需要定义varchar参数的长度,否则SQL将假定一个字符的长度。相反,做如下的事情(1000应该对大多数程序名称来说已经足够了)
CREATE PROCEDURE DropIfRequired
(
@procedureName varchar(1000)
)
答案 2 :(得分:3)
缺少引号,尝试使用exec语句添加它们。
EXEC( 'DROP PROCEDURE ''' + @procName + '''') ( all single quotes)