นอกจากคำตอบที่ใส่ไว้อย่างดีจากรีมัสรวมถึงลิงก์ที่เขาให้ไว้
วิธีการแบ่งปันข้อมูลระหว่างขั้นตอนการจัดเก็บ
มีสถานการณ์ที่คุณได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้เมื่อบันทึกผลลัพธ์ของกระบวนงานที่เก็บไว้ในตาราง:
คำสั่ง INSERT EXEC ไม่สามารถซ้อนกันได้
ธุรกรรมปัจจุบันไม่สามารถกระทำได้และไม่สามารถรองรับการดำเนินการที่เขียนไปยังล็อกไฟล์ ย้อนกลับการทำธุรกรรม
และเมื่อสิ่งนี้เกิดขึ้นในขั้นตอนการจัดเก็บของฉันเองที่ฉันพัฒนาเพื่อการใช้งานเอง
เช่นเครื่องมือที่จะบอกฉันจากlogin
กลุ่มโฆษณาทั้งหมดที่เป็นของและสิทธิ์ทั้งหมดในฐานข้อมูลทั้งหมดในเซิร์ฟเวอร์
ฉันสร้างตาราง temp นอกโพรซีเดอร์และส่งชื่อเป็นพารามิเตอร์
--===============
-- 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)
หลังจากนั้นคุณมีข้อมูลที่คุณต้องการบนหน้าจอหรือถ้าคุณผ่านตาราง temp เป็นพารามิเตอร์มันจะมีข้อมูลทันที
นี้เป็นวิธีการแก้หนึ่งที่ผมพบ แต่ฉันเท่านั้นที่ใช้สำหรับการทำงานของตัวเองDBA
มิฉะนั้นจะถือว่ามีความเสี่ยงสูงสำหรับSQL Injection