Karena tipe data varchar memiliki batas 8000 karakter, saya mencoba menjalankan pernyataan SELECT di dalam pernyataan EXEC yaitu sebagai berikut :
--Untuk mendapatkan daftar pengguna dari database
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'
--Di bawah ini adalah berbagai cara saya mencoba menjalankan pernyataan dan kesalahannya 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
Dan seterusnya, saya Mencoba beberapa kombinasi untuk mencoba mencari tahu masalah sintaksis.
Tapi intinya adalah untuk tidak menyimpan output dari pernyataan pilih dalam variabel karena data dapat melebihi nilai maksimal, melainkan dieksekusi dalam mengeksekusi pernyataan dan menolak izin.
Saya tahu saya dapat memecah output dari pernyataan pilih menjadi bagian-bagian yang lebih kecil dan mengulanginya.
Bantuan atau wawasan apa pun akan sangat dihargai.
Terima kasih atas waktu Anda.
exec('exex @x')
. - person Leon Yue   schedule 26.12.2019