SQL Server如何运行动态语句
我有一个存储过程,它为数据库中的每个权限生成授权脚本。生成授权脚本后,我想知道如何自动运行脚本?(我的目标是创建脚本,然后自动运行脚本) 以下是我的程序:SQL Server如何运行动态语句,sql,sql-server-2008,permissions,grant,Sql,Sql Server 2008,Permissions,Grant,我有一个存储过程,它为数据库中的每个权限生成授权脚本。生成授权脚本后,我想知道如何自动运行脚本?(我的目标是创建脚本,然后自动运行脚本) 以下是我的程序: PROCEDURE [dbo].[IPAM_GRANT_DB_PERMS_SCRIPT] @GRANTACTION NVARCHAR(20), @TYPE NVARCHAR(20), @ACTION INT AS DECLARE @SQL NVARCHAR(2000) BEGIN SET @SQL =
PROCEDURE [dbo].[IPAM_GRANT_DB_PERMS_SCRIPT]
@GRANTACTION NVARCHAR(20),
@TYPE NVARCHAR(20),
@ACTION INT
AS
DECLARE @SQL NVARCHAR(2000)
BEGIN
SET @SQL = ''
SELECT @SQL = (SELECT 'GRANT ' + @GRANTACTION + ' ON ' + 'a.name TO ' + user_name(b.uid) FROM SYSOBJECTS a ,SYSPROTECTS b WHERE a.TYPE IN (@TYPE) AND USER_NAME(b.UID) <> 'public' AND a.NAME NOT LIKE 'dt_%' AND a.ID=b.ID AND ACTION=@ACTION
EXEC @SQL
PRINT @SQL
END
我想如果你改变一下,这一切都应该行得通
exec @SQL
到
如果这还不够清楚,请尝试以下示例:
declare @foo varchar(30)
set @foo = (select 'select 42')
exec (@foo)
我结束这个问题,因为如果当前没有设置权限,那么在新数据库上运行此脚本是多余的。我缺少结束括号。但是,我在运行IPAM_EX_PERMS时收到此错误:子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。
exec (@SQL)
declare @foo varchar(30)
set @foo = (select 'select 42')
exec (@foo)