sql - 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 语句的输出分成更小的块并循环它。
任何帮助或见解将不胜感激。
感谢您的时间。
解决方案
推荐阅读
- svg - 在中风中无法获得真正的白色,真正的黑色
- cytoscape.js - Cytoscape.js 扩展,用于更灵活的边缘着色
- c# - 如何更改 LockScreen 背景(查找 windows.system.UserProfile.dll)?
- kubernetes - 一个完整的 Kubernetes pod 是否仍然保留所需的资源?
- c++ - 使用 MinGW 构建 ASSIMP 导致文件太大错误
- javascript - 为什么悬停时图像不会变为以前的图像?
- postgresql - mat视图的依赖关系示意图
- c# - 将已发布文件的内容从 Angular 读取到 C#
- python - 使用 Python 进行 MSAL 身份验证显示未经授权的客户端?
- c - 在C中的循环内分配和释放内存