【问题标题】:Give DROP PROCEDURE a parameter给 DROP PROCEDURE 一个参数
【发布时间】:2023-03-25 02:37:01
【问题描述】:

我是第一次使用 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

然后我得到以下错误:

消息 102,级别 15,状态 1,过程 DeleteProcedure,第 10 行 '@procedureName' 附近的语法不正确。

任何想法如何做我想做的事?

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

完整的答案是:

声明 @SQL VARCHAR(8000) 选择 @SQL = 'USE' + DB_NAME() + CHAR(10) SET @SQL = @SQL + '删除程序' + @procName --打印@SQL 执行(@SQL)

只有当您登录的默认数据库设置为您想要的数据库时,Andrew 给出的那个才有效。使用动态 sql 时,您将获得一个新的数据库上下文。因此,如果您没有设置默认数据库,您将从 master 执行命令。

【讨论】:

  • 是的,没错。我以前被那个疏忽烧伤过。
【解决方案2】:

需要注意的是,在 DropIfRequired 过程中,您已将过程名称定义如下:

CREATE PROCEDURE DropIfRequired
(    
   @procedureName varchar
)

你需要定义一个varchar参数的长度,否则SQL会假设一个字符的长度。相反,请执行以下操作(对于大多数过程名称来说,1000 应该绰绰有余)

CREATE PROCEDURE DropIfRequired
(    
   @procedureName varchar(1000)
)

【讨论】:

  • 您还可以使用数据类型 sysname(相当于 nvarchar(128)),它可以容纳任何有效的对象名称。
  • “对于大多数过程名称来说,1000 应该绰绰有余”...想到例外我不寒而栗。
【解决方案3】:

它缺少引号,请尝试使用 exec 语句添加它们。

EXEC( 'DROP PROCEDURE ''' + @procName + '''') ( all single quotes)

【讨论】:

  • 或许更好exec('DROP PROCEDURE [' + @procName + ']')
猜你喜欢
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多