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.
1 yorum:
sql server 2012 de global tabloda kullansak aynı hatayı alıyorum:(
USE msdb ;
GO
drop table ##temp
create table ##temp (
job_id uniqueidentifier,
originating_server varchar(30),
name varchar(30),
enabled bit,
description varchar(max),
start_step_id int,
category varchar(30),
owner varchar(30),
notify_level_eventlog int,
notify_level_email int,
notify_level_netsend int,
notify_level_page int,
notify_email_operator varchar(30),
notify_netsend_operator varchar(30),
notify_page_operator varchar(30),
delete_level int,
date_created datetime,
date_modified datetime,
version_number int,
last_run_date int,
last_run_time int,
last_run_outcome int,
next_run_date int,
next_run_time int,
next_run_schedule_id int,
current_execution_status int,
current_execution_step varchar(30),
current_retry_attempt int,
has_step int,
has_schedule int,
has_target int,
type int)
insert into ##temp
EXECute dbo.sp_help_job
@job_name = N'JobAdı',
@job_aspect = N'JOB'
select * from ##temp
Yorum Gönder