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方法。