首页 > 解决方案 > SQL 嵌套执行查询

问题描述

由于数据类型 varchar 有 8000 个字符的限制,我试图在 EXEC语句中执行一个 SELECT 语句,如下所示:

--从数据库中获取用户列表

declare @x varchar(2000)
set @x='select STRING_AGG( concat('+'''['''+',CONCAT([DatabaseUserName],'+''']'''+')),'+''','''+' )
        from(
        SELECT DP1.name AS DatabaseRoleName, isnull (DP2.name,'+ '''No members'''+') AS DatabaseUserName
        FROM sys.database_role_members AS DRM
        RIGHT OUTER JOIN sys.database_principals AS DP1 ON DRM.role_principal_id = DP1.principal_id LEFT OUTER JOIN sys.database_principals AS DP2 ON DRM.member_principal_id = DP2.principal_id 
        WHERE DP1.type ='+ '''R'''+' 
        ) as txt'

--以下是我尝试执行语句的多种方式和错误1)

exec('deny select on [schema].[TABLE] to '+ (exec  @x)) 
ERROR  = Incorrect syntax near '('.

2)

exec('deny select on [schema].[TABLE] to '+ exec N'SP_EXECUTESQL @x')
ERROR  = Incorrect syntax near the keyword 'exec'.

3)

exec('deny select on [schema].[TABLE] to '+ exec SP_EXECUTESQL @x)
ERROR
Incorrect syntax near ')'.
Incorrect syntax near the keyword 'exec'.

4)

exec(('deny select on [schema].[Table] to '+ exec N'@x'))
Sysntax error

依此类推,我尝试了多种组合试图找出语法问题。

但重点是不要将 select 语句的输出存储在变量中,因为数据可能会超过最大值,而是在执行语句中执行并拒绝权限。

我知道我可以将 select 语句的输出分成更小的块并循环它。

任何帮助或见解将不胜感激。

感谢您的时间。

标签: sqlazure-sql-databasenested-query

解决方案


Exec 只支持这样的嵌套 exec:

exec( exec  @x')

参考:

  1. 执行(事务处理 SQL)
  2. EXEC SQL 概述和示例

希望这可以帮助。


推荐阅读