sto iniziando adesso ad imparare le stored procedures, quindi abbiate
pazienza se sparo bestialita' :)
E' possibile creare una stored procedure che abbia come valori di
input i nomi di campi e tabelle?
Provo a spiegarmi meglio. Vorrei creare una stored procedure per una
query del tipo:
----------
select MioCampo, count(*), sum(Field1), sum(Field2)
into OutputTable
from InputTable
Group by MioCampo
Order by MioCampo
---------
Field1 e Field2 sono sempre gli stessi. MioCampo, InputTable ed
OutputTable no, cambiano, e vorrei che fossero i parametri di una
stored procedure.
E' possibile?
Grazie!
Si, ma devi "costruire" una stringa SQL per poi eseguirla
successivamente
CREATE spProva (
@MioCampo varchar(50), @InputTable varchar(50), @OutputTable varchar
(50)
)
AS
DECLARE @tmp varchar(4000)
SET @tmp = 'select MioCampo, count(*), sum(Field1), sum(Field2) into '
SET @tmp = @tmp + @OutputTable
SET @tmp = @tmp + ' from ' + @InputTable
SET @tmp = @tmp + ' Group by ' + @MioCampo
SET @tmp = @tmp + ' order by ' + @MioCampo
EXEC @tmp
RETURN
> Grazie!
Prego, bye
:)
Scusa, manca una variabile
CREATE spProva (
@MioCampo varchar(50), @InputTable varchar(50), @OutputTable varchar
(50)
)
AS
DECLARE @tmp varchar(4000)
SET @tmp = 'select ' + @MioCampo + ', count(*), sum(Field1), sum
(Field2) into '
SET @tmp = @tmp + @OutputTable + ' from ' + @InputTable
SET @tmp = @tmp + ' Group by ' + @MioCampo + ' order by ' + @MioCampo
EXEC @tmp
RETURN
Ciao Pasquy, un paio di osservazioni
> CREATE spProva (
> @MioCampo varchar(50), @InputTable varchar(50), @OutputTable varchar
> (50)
> )
La sintassi "naturale" delle stored non fa uso di parentesi, perch� le
accetti � un mistero della fede.
> DECLARE @tmp varchar(4000)
eheheh, retaggi sql 2000? Perch� 4000? Perch� non un pi� ovvio varchar(max)?
> SET @tmp = 'select ' + @MioCampo + ', count(*), sum(Field1), sum
> (Field2) into '
> SET @tmp = @tmp + @OutputTable + ' from ' + @InputTable
> SET @tmp = @tmp + ' Group by ' + @MioCampo + ' order by ' + @MioCampo
Il Tsql dinamico � gi� abbastanza brutto e pericolo di suo. Se propio si
usa � molto importante farlo a dovere:
set @tmp = 'select ' + quotename(@MioCampo) + ', count(*),
sum(Field1), sum
(Field2) into dbo.' + quotename(@OutputTable) + ' from dbo.' +
quotename(@InputTable) + ' Group by ' + quotename(@MioCampo) + ' order
by ' + @MioCampo
> EXEC @tmp
exec(@tmp)
marc.
Ciao SantaClaus,
> sto iniziando adesso ad imparare le stored procedures, quindi abbiate
> pazienza se sparo bestialita' :)
Temo che cominci subito con una bestialit� :-)
> E' possibile creare una stored procedure che abbia come valori di
> input i nomi di campi e tabelle?
Si, come ti ha mostrato Pasquy � possibile.
Ma attento a non travisare il senso delle stored procedures.
Altrimenti tanto vale continuare a concatenare stringhe lato client.
Le stored sono metodi che fanno riferimento espressamente agli oggetti
in gioco e non implicitamente.
E' un po' come chiedersi se in c# sia possibile passare ad una funzione
il nome della propriet� da valorizzare. Certo che si pu�, via reflection
ma non � di certo la norma e a parte casi molto particolari � scomodo e
complesso da gestire.
marc.
Hai perfettamente ragione, non solo retaggi del 2000, ma di fatto uso
solo (ancora) quello
;-)
Per le parentesi, l'abitudine ad usarle credo venga dal fatto che se
si creano sp o viste tramite Access, questi ne mette 3 per ogni
comando XD
In estrema sintesi, ho l'esigenza di far girare quel tipo di query
tantissime volte, per varie combinazioni di InputTable e MioCampo.
Qual e' secondo voi il modo migliore per automatizzare il tutto? Forse
sto sbagliando approccio e le stored procedure non c'entrano...
Grazie!
Il numero di esecuzione delle query non � significativo, � importante invece
il numero di combinazioni.
Se tale numero � riconducibile a qualche decina allora il metodo pi�
efficiente e sicuro consiste nel definire n stored procedures differenti,
altrimenti l'unica strada percorribile � quella del Dynamic SQL usato "con
criterio" :-).
> Grazie!
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Ciao,
si, ne parla da tempo. In 2008 ancora niente.
Forse nella prossima versione qualcosa, ma di certo non tutto.
marc.
------------------------------------------------
CREATE PROCEDURE LEGGI_TABELLA
@tabella table
SELECT * FORM @tabella
------------------------------------------------
EXEC LEGGI_TABELLA 'dbo.utenti'