в дополнение к красиво поставленному ответу remus включая ссылку, которую он предоставил
Как обмениваться данными между хранимыми процедурами
Есть ситуации, когда вы получаете следующие сообщения об ошибках при сохранении результатов хранимой процедуры в таблице:
Оператор INSERT EXEC не может быть вложенным.
Текущая транзакция не может быть зафиксирована и не может поддерживать операции записи в файл журнала. Откат транзакции
и когда это происходит на моих собственных хранимых процедурах, которые я разрабатываю для собственного использования
например, инструмент, чтобы сказать мне из login
всех групп AD, к которым он принадлежит, и все их разрешения во всех базах данных на сервере
Я создаю временную таблицу вне процедуры и передаю ее имя в качестве параметра
--===============
-- 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
и внутри процедуры, после всех вычислений, когда я возвращаю окончательные данные (ниже примера), я проверяю, выводим ли мы в таблицу или просто обратно на экран, и динамически создаем сценарий.
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)
После этого у вас появится информация, которая вам нужна, или если вы передали временную таблицу в качестве параметра, она будет иметь данные.
это одно решение, которое я нашел, но я использую его только для своих собственных работ, DBA
иначе это будет считаться высоким риском для инъекций Sql .