เนื่องจากประเภทข้อมูล varchar มีขีดจำกัดที่ 8,000 อักขระ ฉันจึงพยายามดำเนินการคำสั่ง SELECT ภายในคำสั่ง EXEC ซึ่งมีดังต่อไปนี้:
--เพื่อรับรายชื่อผู้ใช้จากฐานข้อมูล
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 ออกเป็นส่วนเล็กๆ แล้ววนซ้ำทับมันได้
ความช่วยเหลือหรือข้อมูลเชิงลึกใด ๆ ที่จะได้รับการชื่นชมอย่างมาก
ขอขอบคุณที่สละเวลา
exec('exex @x')
- person Leon Yue   schedule 26.12.2019