en plus de la réponse bien posée de remus, y compris le lien qu'il a fourni
Comment partager des données entre des procédures stockées
Dans certains cas, vous obtenez les messages d'erreur suivants lors de l'enregistrement des résultats d'une procédure stockée dans une table:
Une instruction INSERT EXEC ne peut pas être imbriquée.
La transaction en cours ne peut pas être validée et ne peut pas prendre en charge les opérations écrivant dans le fichier journal. Annule la transaction
et lorsque cela se produit sur mes propres procédures stockées que je développe pour mon propre usage
par exemple un outil pour me dire à partir de login
tous les groupes AD auxquels il appartient et de toutes leurs autorisations dans toutes les bases de données d'un serveur
Je crée une table temporaire en dehors de la procédure et passe son nom en tant que paramètre
--===============
-- this way below it works, by passing a temp table as a parameter
--===============
if OBJECT_ID('tempdb.dbo.#my_table') IS NOT NULL
DROP TABLE #my_table
CREATE TABLE #my_table(
db nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
permission_type nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
login_ nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
role_ nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
Obj nvarchar(517) COLLATE Latin1_General_CI_AS NULL,
Permission nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
script nvarchar(1008) COLLATE Latin1_General_CI_AS NULL
)
exec sp_GetLoginDBPermissionsX
@Login='my_loginname',
@debug=0,
@where_to_save ='#my_table'
select *
from #my_table
et à l'intérieur de la procédure, après tous les calculs, lorsque je renvoie les données finales (sous un exemple), je vérifie si nous exportons dans une table ou juste à l'écran, et créons le script de manière dynamique.
select @sql = case when @where_to_save IS not null then
'
insert into ' + @where_to_save + '(db,Permission_Type,login_,role_,obj,Permission,script) '
else '' end +
'
SELECT
J.db,
J.Permission_Type,
J.login_,
J.role_,
J.Obj,
J.Permission,
J.script
FROM #tablewithpermissions J
WHERE J.login_ IN ( SELECT L1.LOGIN_FROM COLLATE Latin1_General_CI_AS FROM #logins L1)
OR J.role_ IN ( SELECT L1.LOGIN_FROM COLLATE Latin1_General_CI_AS FROM #logins L1)
ORDER BY J.DB, J.[permission_order]
'
--print(@sql)
EXEC(@SQL)
Après cela, vous avez soit les informations dont vous avez besoin à l'écran, ou si vous avez passé une table temporaire en tant que paramètre, elle aura maintenant les données.
C’est une solution que j’ai trouvée, mais je ne l’utilise que pour mes propres travaux, DBA
sinon cela sera considéré comme un risque élevé pour Sql Injection .