我有几个查询删除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
语句中的字符串,其余时间作为对存储过程的引用我创建/删除。
答案 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;