Sql server SQL-定义一个指向存储过程的变量

Sql server SQL-定义一个指向存储过程的变量,sql-server,Sql Server,我有几个查询可以删除进程(如果它存在),重新创建它,并设置对它的权限,如下所示: 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(i

我有几个查询可以删除进程(如果它存在),重新创建它,并设置对它的权限,如下所示:

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
语句中的字符串,另一种是作为我正在创建/删除的存储过程的引用

我假设您的目标是用一个脚本替换“几个脚本”,该脚本可以通过更改保存存储过程名称的变量的值来使用

如果是这样,您可以尝试一种动态方法:

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命令。如果没有,则需要为每个存储的进程执行两个单独的动态语句。

对预期的ddl语句使用动态sql。下面是一个示例实现

-- 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;

您可以尝试使用动态sql方法。