Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Passare nomi di campi e tabelle come parametri ad una stored procedure

732 views
Skip to first unread message

SantaClaus

unread,
May 28, 2009, 10:54:29 AM5/28/09
to
Ciao a tutti,

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!

Pasquy_77

unread,
May 28, 2009, 11:12:54 AM5/28/09
to

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
:)

Pasquy_77

unread,
May 28, 2009, 11:17:42 AM5/28/09
to

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

Marcello

unread,
May 28, 2009, 11:27:10 AM5/28/09
to
Pasquy_77 ha scritto:
> Scusa, manca una variabile

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.

Marcello

unread,
May 28, 2009, 11:31:42 AM5/28/09
to
SantaClaus ha scritto:
> Ciao a tutti,

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.

Pasquy_77

unread,
May 28, 2009, 12:00:35 PM5/28/09
to
On 28 Mag, 17:27, Marcello <marcello.pole...@epomops.it> wrote:
> Pasquy_77 ha scritto:
>
> > Scusa, manca una variabile
>
> 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.

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

SantaClaus

unread,
May 28, 2009, 12:20:15 PM5/28/09
to
On 28 May, 16:31, Marcello <marcello.pole...@epomops.it> wrote:
> SantaClaus ha scritto:
>
> > Ciao a tutti,
>
> Ciao SantaClaus,
> [...]
> Temo che cominci subito con una bestialità :-)

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!

Lorenzo Benaglia

unread,
May 28, 2009, 3:30:53 PM5/28/09
to
"SantaClaus" <myema...@googlemail.com> wrote:
> In estrema sintesi, ho l'esigenza di far girare quel tipo di query
> tantissime volte, per varie combinazioni di InputTable e MioCampo.

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

Alessandro Andreatta

unread,
May 29, 2009, 2:08:01 AM5/29/09
to
non si era parlato con sql server 2008 di poter passare tabelle come
parametri ?
è implementata la cosa ?

Marcello

unread,
May 29, 2009, 3:01:40 AM5/29/09
to
Alessandro Andreatta ha scritto:

> non si era parlato con sql server 2008 di poter passare tabelle come
> parametri ?
> è implementata la cosa ?

Ciao,

si, ne parla da tempo. In 2008 ancora niente.
Forse nella prossima versione qualcosa, ma di certo non tutto.

marc.

Lorenzo Benaglia

unread,
May 29, 2009, 3:47:49 AM5/29/09
to
"Alessandro Andreatta" <and...@REMOVElibero.it> wrote:
> non si era parlato con sql server 2008 di poter passare tabelle come
> parametri ?
Io non l'ho mai sentito dire :-)
In SQL Server 2008 si possono definire i table-valued parameters, ma questo
non ha niente a che vedere con il "poter passare tabelle come parametri":
http://msdn.microsoft.com/en-us/library/bb510489.aspx

Alessandro Andreatta

unread,
May 29, 2009, 2:47:01 PM5/29/09
to
quando se ne parlava io mi immaginavo una roba del tipo

------------------------------------------------
CREATE PROCEDURE LEGGI_TABELLA
@tabella table

SELECT * FORM @tabella

------------------------------------------------
EXEC LEGGI_TABELLA 'dbo.utenti'

0 new messages