彼が提供したリンクを含むレムスによるきちんと置かれた答えに加えて
ストアドプロシージャ間でデータを共有する方法
ストアドプロシージャの結果をテーブルに保存するときに、次のエラーメッセージが表示される場合があります。
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)
その後、必要な情報を画面に表示するか、パラメータとして一時テーブルを渡した場合、データを取得します。
これは私が見つけた1つの解決策ですが、私は自分の仕事にのみ使用しDBA
ます。そうしないと、SQLインジェクションのリスクが高いと見なされます。