09/05/2011

Query dinamiche in T-SQL (parte 1)

A cura di Gianluca Negrelli


Pagina 1 di 3

Le query dinamiche rappresentano un potente strumento di interazione con SQL Server. Una query dinamica viene costruita attraverso la valutazione a runtime di semplici stringhe e la loro conversione in query.

I due costrutti attraverso cui SQL Server permette la produzione dinamica di codice T-SQL sono EXECUTE() (che diventa EXEC() nella sua forma contratta) e sp_executesql. Sebbene entrambe le istruzioni permettano alla fine di ottenere lo stesso risultato, cioé l'esecuzione di codice “interpretato” a run-time, le loro sintassi e le implicazioni che derivano dal loro utilizzo sono estremamente diverse.


Ambiente di test

Lavoreremo su un database Ordini dotato di due tabelle: Prodotti e Negozi. Entrambe le tabelle sono molto elementari e la loro struttura è la seguente:

CREATE TABLE dbo.Prodotti(
	ProdottoId int IDENTITY(1,1) NOT NULL,
	Descrizione varchar(50) NOT NULL
) 
GO
CREATE TABLE dbo.Negozi(
	NegozioId int IDENTITY(1,1) NOT NULL,
	Indirizzo varchar(50) NOT NULL
) 

Alimentiamole con qualche record e cominciamo con le sperimentazioni.


EXECUTE()

La funzione EXECUTE() o EXEC() permette la valutazione e la successiva esecuzione di una stringa passata come argomento. Prendiamo ad esempio una semplice istruzione di selezione e la sua corrispondente creata con codice dinamico.

SELECT * FROM Prodotti
EXEC ('SELECT * FROM Prodotti')

Entrambe le query producono naturalmente lo stesso risultato finale ma, in query di questo tipo, le peculiarità e i vantaggi dell'uso della sintassi dinamica non vengono evidenziati.

Ipotizziamo allora di dover affrontare una casistica più complessa: dobbiamo creare una SP in cui il nome della tabella da interrogare sia un parametro fornito dall'esterno. Senza utilizzare il codice dinamico avremmo qualche difficoltà a raggiungere l'obiettivo. Vediamo come può essere affrontato il problema in entrambe le modalità.

CREATE PROCEDURE GetRecord
	@NomeTabella as varchar(50)
AS
BEGIN
	-- Senza l'uso di EXEC()
	IF @NomeTabella = 'Prodotti'
		SELECT * FROM Prodotti 
	ELSE
		SELECT * FROM Negozi
	
	-- Con l'uso di EXEC
	EXEC ('SELECT * FROM ' + @NomeTabella)
END

Salviamo la SP e proviamo ad eseguirla.

EXEC GetRecord 'Prodotti'

Il risultato sarà composto di due resultset esattamente identici.
Per il primo resultset, ottenuto senza utilizzare codice dinamico, abbiamo dovuto affidarci ad una serie di IF e prevedere a monte quali avrebbero potuto essere i valori del parametro @NomeTabella passato alla SP.
Nel secondo caso l'interrogazione è invece parametrizzata e nativamente aperta a successive estensioni (interrogazioni di ulteriori tabelle).

Pagina 1 di 3

Commenti



Nessun commento disponibile.

Cobisi EmailVerify.NET is a Microsoft .NET software component that validates email addresses. valid email