แบบสอบถามการดำเนินการ SQL ที่ซ้อนกัน

เนื่องจากประเภทข้อมูล 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 ออกเป็นส่วนเล็กๆ แล้ววนซ้ำทับมันได้

ความช่วยเหลือหรือข้อมูลเชิงลึกใด ๆ ที่จะได้รับการชื่นชมอย่างมาก

ขอขอบคุณที่สละเวลา


person Eric    schedule 19.12.2019    source แหล่งที่มา
comment
Exec รองรับเฉพาะ sysntax เช่น exec('exex @x')   -  person Leon Yue    schedule 26.12.2019


คำตอบ (1)


Exec รองรับเฉพาะ exec ที่ซ้อนกันเช่นนี้:

exec( exec  @x')

อ้างอิง:

  1. ดำเนินการ (ธุรกรรม-SQL)
  2. ภาพรวมและตัวอย่าง EXEC SQL

หวังว่านี่จะช่วยได้

person Leon Yue    schedule 26.12.2019