Smeštanje rezultata procedure u temp tabelu

Objavljeno: 20-01-2014 | Autor: Nenad Živković | Kategorija: Stored procedure, T-SQL, Trikovi

Ознаке: ,

0

Sintaksa koju svi često volimo da koristimo je SELECT * INTO #temp FROM.. koja nam omogućava da brzo kreiramo temp tabelu od rezultata koji upit vraća.

Verovatno je i svako ponekad poželeo da to isto iskoristi i da rezultate stored procedure na sličan način smesti u neku privremenu tabelu, ali već prvi pokušaj će pokazati da takva sintaksa za procedure ne postoji.

SELECT * INTO #temp FROM EXEC dbo.usp_Kefalo_Procedura; --?!?!
EXEC INTO #temp dbo.usp_Kefalo_Procedura; --?!?!

Jedino ispravno rešenje je unapred kreiranje temp tabele, i njeno punjenje INSERT..EXEC sintaksom:

CREATE TABLE #tempTabela (Kolona INT);

INSERT INTO #tempTabela
EXEC dbo.usp_Kefalo_Procedura;

Međutim, ukoliko postoje određeni uslovi, moguće je iskoristiti funkciju OPENROWSET i postići željeni cilj. Komanda bi izgledala ovako:

SELECT * INTO #tempTabela 
FROM OPENROWSET ('SQLNCLI', 'Server=LOCALHOST;Trusted_Connection=yes'
	, 'EXEC SQL_KEFALO.dbo.usp_Kefalo_Procedura');

SELECT * FROM #tempTabela;

Da bi ovaj upit mogao da se izvrši, potrebno je da budu zadovoljeni sledeći uslovi:

  • Procedura mora da vraća uvek isti result-set
  • Sve kolone koje vraća moraju imati naziv (uslov da bi SELECT INTO prošao)
  • Procedura ne sme da koristi #temp tabele niti @table varijable

Ipak, pored ovih ograničenja, dozvoljeno je sledeće:

  • Procedura može da koristi dinamičke upite
  • Može da vraća više result-setova – ali samo će prvi biti uzet u obzir

Takođe, potrebno je da na serveru bude uključena mogućnost Ad Hoc Distributed Queries, što se postiže komandama:

sp_configure 'Show Advanced Options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO

S obzirom da aktiviranje ovih opcija zahteva administratorske privilegije, a i predstavlja donekle rizik po bezbednost, vrlo je verovatno da na nekom produkcionom okruženju neće biti dostupne. Čak i da jesu, svakako ne bih preporučio da ih koristite, ali za potrebe testiranja ili debagovanja na ne-produkcionim serverima ne bi trebalo da bude problem.

Par napomena i oko sintakse parametara unutar OPENROWSET-a:

  • S obzirom da se komanda izvršava na serveru, drugi parametar uvek može biti LOCALHOST, ne morate navoditi pravo ime servera. Jedino ukoliko ne koristite default nego imenovanu instancu, morate je navesti. Naravno i umesto LOCALHOST, mogu proći i svi drugi aliasi kao što su . (tačka) ili (local). Npr: Server=(local)\SQL2012
  • U poslednjem parametru gde je naziv procedure morate navesti i ime baze
  • Ukoliko, u pozivu vaše procedure, morate koristiti i paramtre koji nisu poznati unapred, moraćete i dinamički da kreirate taj string