рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐ рд╕реЗ рд╕рд╛рд░рдгреАрдмрджреНрдз рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдирд╛

рд╣рдо рдПрд╕рдХреНрдпреВрдПрд▓ рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдмрд╛рдж рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗрд╡рд▓ рдЬрдЯрд┐рд▓ рдПрд╕рдХреНрдпреВрдПрд▓ рддрд░реНрдХ рдФрд░ рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╣реИрдВред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╕рдм Microsoft SQL Server 2008 рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЬреЛ рд▓реЛрдЧ рд╡рд┐рд╖рдп рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ рдкреЛрд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдВрдЪрд╡реАрдВ рд╡рд┐рдзрд┐ рдкрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред

рдЬрд┐рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░реЗрдВ:
create procedure Proc1 as begin select 1 p1, 'b' p2 end 

1 рд╡рд┐рдзрд┐


рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХред insert ... exec ... рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ insert ... exec ... рдирд┐рд░реНрдорд╛рдг
 if object_id(N'tempdb..#t1',N'U') is not null drop table #t1 create table #t1(p1 int, p2 varchar(max)) insert #t1 exec Proc1 select * from #t1 

рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖:



2 рд╡рд┐рдзрд┐


рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рд┐рдЦрдХрд░ред рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 create procedure Proc1 as begin insert #t1(p1, p2) select 1 p1, 'b' p2 end 

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рд▓рд╛рдЗрди рд▓рдкреЗрдЯрддреЗ рд╣реИрдВред
 if object_id(N'tempdb..#t1',N'U') is not null drop table #t1 create table #t1(p1 int, p2 varchar(max)) exec Proc1 select * from #t1 

рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖:


 alter procedure Proc1 as begin declare @show bit if object_id(N'tempdb..#t1',N'U') is null begin set @show = 1 create table #t1(p1 int, p2 varchar(max)) end insert #t1(p1, p2) select 1 p1, 'b' p2 if (@show = 1) begin select * from #t1 end end 

рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХрд╛рд░реНрдп рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рд╕рддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рд▓реЙрдХрд┐рдВрдЧ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

3 рд╡рд┐рдзрд┐


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░рд┐рд╢реЛрдзрди рд╣реИред рд╕рдорд░реНрдерди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╕реНрдЯрдо рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдВред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 create type tt1 as table(p1 int, p2 varchar(max)) go create procedure Proc1 as begin insert #t1(p1, p2) select 1 p1, 'b' p2 end go -- : declare @t1 tt1 if object_id(N'tempdb..#t1',N'U') is not null drop table #t1 select * into #t1 from @t1 exec Proc1 select * from #t1 

рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖:



4 рд╡рд┐рдзрд┐


рддреАрд╕рд░реА рд╡рд┐рдзрд┐ рдХреА рдЬрдЯрд┐рд▓рддрд╛, рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ Microsoft SQL Server 2005 рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
 create procedure Proc1 as begin insert #t1(p1, p2) select 1 p1, 'b' p2 end go create procedure Proc1_AlterTable as begin alter table #t1 add p1 int, p2 varchar(max) alter table #t1 drop column delmy end go -- : if object_id(N'tempdb..#t1',N'U') is not null drop table #t1 create table #t1(delmy int) exec Proc1_AlterTable exec Proc1 select * from #t1 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдорддреМрд░ рдкрд░ рдбреЗрд▓реНрдореА рдЕрд╕реНрдерд╛рдпреА рдХреЙрд▓рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рддрд╛рд▓рд┐рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдкрд╣рд▓реЗ рдХреЙрд▓рдо (рдпрд╣рд╛рдВ рдкреА 1 рдХреЗ рд╕рд╛рде) рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рд╣реИред

рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖:



5 рд╡рд┐рдзрд┐


рдпрд╣ рд╡рд┐рдзрд┐ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдпрд╣ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ SQL рдХреНрд╡реЗрд░реА рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

1. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ:
 if object_id('tempdb..#ttInclusion', 'U') is null create table #ttInclusion(lvl int, i int) exec util.InclusionBegin 

2. рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ рдЬреЛ #Output рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП into #Output , into #Output5 , into #OutputMySelect )ред рдпрджрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдирд╣реАрдВ рдмрдирд╛рддреА рд╣реИ, рддреЛ рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
3. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд▓рд╛рдЗрди рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ:
 exec util.InclusionEnd --  ,   #Output,       util.InclusionBegin 

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
 create procedure Proc1 as begin if object_id('tempdb..#ttInclusion', 'U') is null create table #ttInclusion(lvl int, i int) exec util.InclusionBegin select 1 p1, 'b' p2 into #Output1 exec util.InclusionEnd --  ,   #Output,       util.InclusionBegin end 

рдкреНрд░рдХреНрд╖реЗрдкрдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 if object_id('tempdb..#ttInclusionParameters', 'U') is null create table #ttInclusionParameters(lvl int, pr int, val varchar(max)) exec util.InclusionRun' select * from #InclusionOutput1 ', 1, '#InclusionOutput' exec Proc1 

рдЪреВрдВрдХрд┐ рдЙрддреНрдкрдиреНрди SQL рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдЫреЛрдЯреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред рдпрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рд╣реИ, рддреЛ рдЖрдк рдпрд╛ рддреЛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдбрд╛рдпрдиреЗрдорд┐рдХ рднрд╛рдЧ рд╕реЗ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЙрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдбреЗрдЯрд╛ рдХреЛ рдирдП рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкреБрдирдГ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рдФрд░ "рдЕрддрд┐рд░рд┐рдХреНрдд" рдирдХрд▓ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреВрд░реНрд╡-рд╕рдореВрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рднреА рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред )ред

рдЙрдкрдпреЛрдЧред util.InclusionRun рдлрд╝рдВрдХреНрд╢рди рдХреЛ 3 рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ:


рдХрд╛рдо рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдЪрд▓ рд░рд╣реЗ util.InclusionRun рдмрд┐рдирд╛, Proc1 рдХреЛ рдЪрд▓рд╛рдирд╛ред util.InclusionRun рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрди рд╕рднреА рдбреЗрдЯрд╛ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХреА рдорд╛рддреНрд░рд╛:



рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖:



рдЙрдкрдпреЛрдЧ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди:

рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
рдХреЛрдб:
 if object_id('dbo.TestInclusion') is not null drop procedure dbo.TestInclusion go create procedure dbo.TestInclusion @i int as begin if object_id('tempdb..#ttInclusion', 'U') is null create table #ttInclusion(lvl int, i int) exec util.InclusionBegin if object_id('tempdb..#tmp2', 'U') is not null drop table #tmp2 select @i myI into #tmp2 if object_id('tempdb..#tmp3', 'U') is not null drop table #tmp3 select @i + 1 myI into #tmp3 select * into #Output0 --  (  util.InclusionEnd) from #tmp2 union all select * from #tmp3 select ' TestInclusion' alt into #OutputQwerty --  (  util.InclusionEnd) exec util.InclusionEnd --     #Output       util.InclusionBegin end go set nocount on set ansi_warnings off if object_id('tempdb..#ttInclusionParameters', 'U') is not null drop table #ttInclusionParameters go select ' 1:  TestInclusion.         myI   : 2  3.    1 : " TestInclusion"' exec dbo.TestInclusion 2 go select ' 2:  TestInclusion.         testSum   : 5' if object_id('tempdb..#ttInclusionParameters', 'U') is null create table #ttInclusionParameters(lvl int, pr int, val varchar(max)) exec util.InclusionRun ' select sum(myI) testSum from #InclusionOutput1 ', 1, '#InclusionOutput' exec dbo.TestInclusion 2 


рдкрд░рд┐рдгрд╛рдо:
 -----------------------------------------------------------------------------------------------------------------------------------------------------------  1:  TestInclusion.         myI   : 2  3.    1 : " TestInclusion" myI ----------- 2 3 alt -----------------------  TestInclusion ------------------------------------------------------------------------------------------------------  2:  TestInclusion.         testSum   : 5 testSum ----------- 5 



рд╕реНрд╡рдпрдВ рдХрд╛рд░реНрдп:

рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 if not exists(select top 1 null from sys.schemas where name = 'util') begin exec ('create schema util') end go alter procedure util.InclusionBegin as begin /*   : 1.       1.1.     : if object_id('tempdb..#ttInclusion', 'U') is null create table #ttInclusion(lvl int, i int) exec util.InclusionBegin 1.1.   select'         #Output ( into #Output, into #Output5, into #OutputMySelect) 1.2.     : exec util.InclusionEnd --  ,   #Output,       util.InclusionBegin 2.  ,    ,       (      #Output* ): if object_id('tempdb..#ttInclusionParameters', 'U') is null create table #ttInclusionParameters(lvl int, pr int) exec util.InclusionRun('<sql         >')  .   util.InclusionRun */ set nocount on set ansi_warnings off declare @lvl int if object_id('tempdb..#ttInclusionParameters', 'U') is not null begin select @lvl = max(lvl) from #ttInclusionParameters -- null ,           if (@lvl is not null) begin insert #ttInclusionParameters(lvl, pr) select @lvl+1 lvl, null pr end end if object_id('tempdb..#ttInclusion', 'U') is not null begin --     #Output,   util.InclusionEnd    insert #ttInclusion(lvl, i) select isnull(@lvl, 0), so.object_id i from tempdb.sys.objects so where so.type = 'U' and so.name like '#[^#]%' and object_id('tempdb..' + so.name, 'U') is not null and not exists (select top 1 null from #ttInclusion where i = so.object_id) end end GO go alter procedure util.InclusionEnd as begin /*   : 1.       1.1.     : if object_id('tempdb..#ttInclusion', 'U') is null create table #ttInclusion(lvl int, i int) exec util.InclusionBegin 1.1.   select'         #Output ( into #Output, into #Output5, into #OutputMySelect) 1.2.     : exec util.InclusionEnd --  ,   #Output,       util.InclusionBegin 2.  ,    ,       (      #Output* ): if object_id('tempdb..#ttInclusionParameters', 'U') is null create table #ttInclusionParameters(lvl int, pr int) exec util.InclusionRun('<sql         >')  .   util.InclusionRun */ set nocount on set ansi_warnings off ---------------------------------------------------------------------------------------------------- --  declare @lvl int , @p0 varchar(max) --(@sql) sql     , @p1 varchar(max) --(@notShowOutput)   '1'        ,    #Output,    , @p2 varchar(max) --(@replaceableTableName)    if object_id('tempdb..#ttInclusionParameters', 'U') is not null begin --   select @p1 = max(val) from #ttInclusionParameters where pr = 1 --      (max(lvl) -    null     util.InclusionBegin) select @lvl = max(lvl) - 1 from #ttInclusionParameters if @lvl is not null begin -- select @p0 = max(case when pr = 0 then val end) , @p2 = max(case when pr = 2 then val end) from #ttInclusionParameters where lvl = @lvl having max(pr) is not null --   ,    ,   null- delete #ttInclusionParameters where lvl >= @lvl and (lvl > @lvl or @p0 is not null) end end ---------------------------------------------------------------------------------------------------- --    #Output if object_id('tempdb..#InclusionOutputs', 'U') is not null drop table #InclusionOutputs create table #InclusionOutputs(i int, tableName varchar(max), num int) if object_id('tempdb..#ttInclusion', 'U') is not null begin insert #InclusionOutputs(i, tableName, num) select so.object_id i, left(so.name, charindex('_', so.name)-1) tableName, row_number() over (order by so.create_date) num from tempdb.sys.objects so where so.type = 'U' and so.name like '#[^#]%' and object_id('tempdb..' + so.name, 'U') is not null and so.name like '#Output%' and not exists (select top 1 null from #ttInclusion where i = so.object_id and lvl <= isnull(@lvl, lvl)) --   ,     delete #ttInclusion where lvl <= @lvl end else begin insert #InclusionOutputs(i, tableName, num) select so.object_id i, left(so.name, charindex('_', so.name)-1) tableName, row_number() over (order by so.create_date) num from tempdb.sys.objects so where so.type = 'U' and so.name like '#[^#]%' and object_id('tempdb..' + so.name, 'U') is not null and so.name like '#Output%' end ---------------------------------------------------------------------------------------------------- --  (    -   #Output) declare @srcsql varchar(max) --    util.InclusionRun if (@p0 is not null and @p0 <> '') begin --  @replaceableTableName if (@p2 is not null and @p2 <> '') begin select @p0 = replace(@p0, @p2 + cast(num as varchar(10)), replace(tableName, '#', '#<tokenAfterReplace>')) from #InclusionOutputs order by num desc select @p0 = replace(@p0, '<tokenAfterReplace>', '') end --   select @srcsql = isnull(@srcsql + ' ' + char(13), '') + @p0 + ' ' + char(13) end --  #Output  if (@p1 is null or @p1 <> '1') --  1,   ! begin --    select @srcsql = isnull(@srcsql + ' ' + char(13), '') --   select @srcsql = isnull(@srcsql + ' ', '') + 'select * from ' + tableName from #InclusionOutputs order by num asc end if (@srcsql is not null) begin exec (@srcsql) end end go alter procedure util.InclusionRun @sql varchar(max), --sql       ( util.InclusionEnd) @notShowOutput bit, -- = 1,       #Output @replaceableTableName varchar(100) = '#Output' --        @sql,      #Output*   . -- ,   #InclusionOutput,       #Output55  #Output0A, --   @sql    #Output55   #InclusionOutput1,   #Output0A   #InclusionOutput2 as begin set nocount on set ansi_warnings off if object_id('tempdb..#ttInclusionParameters', 'U') is null begin print ' util.InclusionRun  , ..      #ttInclusionParameters! ' return end declare @lvl int select @lvl = isnull(max(lvl), 0) + 1 from #ttInclusionParameters insert #ttInclusionParameters(lvl, pr, val) select @lvl, 0, @sql union all select @lvl, 1, '1' where @notShowOutput = 1 union all select @lvl, 2, @replaceableTableName end 



рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ


рдЖрдк ( OUTPUT ) рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдХрд░реНрд╕рд░ рдпрд╛ рдПрдХреНрд╕рдПрдордПрд▓ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рд▓реЗрдЦ рд╣реИ ред
рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХрд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдпрджрд┐ рдХрд░реНрд╕рд░ рдХреЛ рд╢реБрд░реВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди XML рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдо рджрд┐рдП рдЧрдП рд╣реИрдВред
рдпрд╣ рд╕реБрдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ :)

UPD 03/31/2014: рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдкреЛрд╕реНрдЯ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛

Source: https://habr.com/ru/post/In217649/


All Articles