yine bir sorunla karşı karşıyayız,
malum MSSQL de uzun prosedürler yazarken, ayak işlerini başka prosedürlere yaptırmamız gerekebiliyor. Fakat , iç içe çağırdığınız prosedürlerde, eğer çağırdığınız prosedür başka bir prosedür çağırıyor ve bir #temp tabloya veri sokuyorsa ve sizin çağırdığınız prosedürde kendi içinde veri sokuyorsa, ve sizde son prosedürde bir temp tabloya veri sokuyorsanız (tamam biraz karışık oldu ).
An INSERT EXEC statement cannot be nested.
diye bir hata verecektir.
Çözümü de GLOBAL TEMP TABLE kullanmaktır,
Bazı sitelerden OPENROWSET gibi abidik gubidik, sorgu sırasında dahi SQL bağlantısı açan, uzun karışık yöntemler mevcuttur,
boşverin onları gülün geçin "hmm fevkalede" gibi yapmacık tepkiler verip uzaklaşın ordan :).
Nedir peki GLOBAL TEMP TABLE ;
Küreselleşen dünyada ki küreselleşmiş temp table yani;
efendim normalde tanımlarken #temp yazmıyor muyuz?
bunda sadece ##temp yazacağız, o kadar :=).
Yani arasında ki fark, rakıyı tek içmekle duble içmek arasında ki fark kadar.
Yani çağırdığımız prosedürlerden birinin sonucunu global temp tabloya atacağız ve son prosedürden çağırma işlemini ve arkasından drop işlemini yapacağız. Normalde temp tablolar prosedürle işiniz bitince otomatik droplanırken, bunda bağlantı kapanınca droplanıyor, siz her ihtimale karşı işiniz bitince drop edin :)
Örnek; (benim örneğim değil, kendimin ki baya uzun )
create proc test1
as
select orderid, customerid, employeeid from ##temp2
go
create proc test2
as
create table ##temp2 (orderid int ,
customerid char(5), employeeid int)
insert into ##temp2 exec test3
go
create proc test3
as
select top 100 orderid, customerid,
employeeid from orders
go
exec test2
exec test1
go
drop proc test1, test2, test3
drop table ##temp2
go
----
Son söz ;
Ainesi iştir prosedürün, koda bakılmaz.