SQL - 定义指向存储过程的变量

时间:2015-08-10 20:13:48

标签: sql-server

我有几个查询删除proc,如果它存在,重新创建它,并设置权限,类似于:

SET QUOTED_IDENTIFIER ON 
GO    
SET ANSI_NULLS ON 
GO

if exists (select * 
           from dbo.sysobjects 
           where id = object_id(N'[dbo].[spMyStoredProcedureName]') 
           and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[spMyStoredProcedureName]
GO

CREATE PROCEDURE [dbo].[spMyStoredProcedureName]
AS

/* more proc stuff  */

GRANT EXECUTE ON [dbo].[spMyStoredProcedureName] 
              TO Some_User_Group

我的问题是:有没有办法为[dbo].[spMyStoredProcedureName]定义变量,以便我可以声明一次并引用变量?我需要使用变量两种方式 - 一次作为select语句中的字符串,其余时间作为对存储过程的引用我创建/删除。

2 个答案:

答案 0 :(得分:0)

我假设你的目标是用一个脚本替换你的“几个脚本”,这个脚本可以通过改变包含存储过程名称的变量的值来使用。

如果是这样,你可以尝试动态方法:

Declare @spMyStoredProcedureName nvarchar(255);

--either use a cursor or whatever means to populate the variable.   
--for this example I will simply set it

SET @spMyStoredProcedureName = '[dbo].[spMyStoredProcedureName]';

DECLARE @sql nvarchar(max);

SET @sql='
SET QUOTED_IDENTIFIER ON 
GO    
SET ANSI_NULLS ON 
GO

if exists (select * 
           from dbo.sysobjects 
           where id = object_id(N''@spMyStoredProcedureName'') 
           and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure @spMyStoredProcedureName
GO

CREATE PROCEDURE @spMyStoredProcedureName
AS

/* more proc stuff  */

GRANT EXECUTE ON @spMyStoredProcedureName 
              TO Some_User_Group
';

SET @sql = REPLACE(@sql, '@spMyStoredProcedureName', @spMyStoredProcedureName)
EXECUTE(@sql)

请注意,执行此操作时,您需要转义存储过程代码中的所有单引号。另外我不太确定你可以在动态sql中使用GO命令。如果没有,您需要为每个存储过程执行两个单独的动态语句。

答案 1 :(得分:0)

将动态sql用于预期的ddl语句。下面的示例实现。

-- Declare variable to store the procedure name
Declare @proc varchar(100) = 'myProc';

-- Construct the ddl statement
DECLARE @script nvarChar(MAX);
SET @script = 
'
if exists (select * 
           from dbo.sysobjects 
           where id = object_id(N'''+ @proc + ''') 
           and OBJECTPROPERTY(id, N''IsProcedure'') = 1)
drop procedure ' + @proc + ';

GO

CREATE PROCEDURE ' + @proc + '
AS
    print ''Hello World!'';
/* more proc stuff  */
GO

GRANT EXECUTE ON ' + @proc + '
              TO Some_User_Group;
'

SET @script = 'EXEC (''' + REPLACE(REPLACE(@script, '''', ''''''), 
          'GO', '''); EXEC(''') + ''');'

-- Run the dynamic ddl
EXEC (@script);

-- Test
exec myproc;