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)