22 messaggi dal 05 febbraio 2009
Ciao a tutti

vorrei fare una SP comune fra più tabelle simili, quindi l'unica cosa che cambia è il nome della tabella.

Ho scritto questo:

CREATE PROCEDURE [dbo].[spProva]
@tab varchar(20) = ''

AS
BEGIN

SELECT *
FROM @tab

END

Però in fase di check mi dice "Dichiarare la variabile di tabella @tab".

Perchè???
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
andrea99999 wrote:
Ciao a tutti

vorrei fare una SP comune fra più tabelle simili, quindi l'unica cosa che cambia è il nome della tabella.

Ho scritto questo:

CREATE PROCEDURE [dbo].[spProva]
@tab varchar(20) = ''

AS
BEGIN

SELECT *
FROM @tab

END

Però in fase di check mi dice "Dichiarare la variabile di tabella @tab".

Perchè???

sia gli identificatori di colonna della SELECT list come anche gli identificatori previsti nella proiezione della clausola FROM ed anche quelli presenti nelle clausole WHERE e ORDER BY devono essere delle "costanti" e non possono essere parametrizzati...
quello che vuoi fare tu si definisce quindi "SQL Dinamico", dove si provvede a generare un comando SQL parametrizzato da eseguirsi a richiesta.. tecnicamente la cosa e' fattibile e possibile, anche se per certi versi "deprecabile"... lascia molte porte aperte a problematiche di SQL Injection, ovviamente invalida la riutilizzazione dei piani di esecuzione (nel caso, quindi, aggiungi la clausola WITH RECOMPILE all'header della procedura in modo che i piani generati vengano direttamente marcati come non riciclabili ed il parser e tokenizer non perdano tempo a valutarli).. ad ogni modo Erland Sommarskog, SQL Server MVP, ha pubblicato un bellissimo articolo su tale funzionalita' che puoi leggere presso
http://www.sommarskog.se/dynamic_sql.html
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
20 messaggi dal 21 settembre 2006
La risposta data da andrea è corretta.
Se vuoi fare una cosa del genere devi impostarla cosi' :

CREATE PROCEDURE [dbo].[spProva]
@tab varchar(20) = ''

AS
BEGIN

Exec ('SELECT * FROM ' + @tab)

END
22 messaggi dal 05 febbraio 2009
Bene grazie. Ma evidentemente io non lo posso fare, infatti mi dà errore:

DECLARE myCursor CURSOR FOR
--select Coordinate
--from TValoriParametri
Exec ('select coordinate from ' + @tabella)
OPEN myCursor
FETCH NEXT FROM myCursor INTO @gPark
WHILE @@FETCH_STATUS = 0
BEGIN
SET @distPark = @g.STDistance(@gPark)/1000

IF @distPark < @distMin
BEGIN
SET @distMin = @distPark
--SELECT @distMin as [Test]
END -- If

FETCH NEXT FROM myCursor INTO @gPark
END -- While
CLOSE myCursor
DEALLOCATE myCursor
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
andrea99999 wrote:
Bene grazie. Ma evidentemente io non lo posso fare, infatti mi dà errore:

DECLARE myCursor CURSOR FOR

spe... la dichiarazione di un cursore [che gia' e' una cosa aberrante di suo  ] non puo' basarsi su codice dinamico eseguito via "EXEC ..."... questo sarebbe proprio il "peggio del peggio"  ..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
20 messaggi dal 21 settembre 2006
Ha ragione Andrea x l'ennesima volta.
Io non sapevo che il tutto si basava sullo scorrere il resultset attraverso un cursore....
L' SQL Dinamico funziona con i pro e contro ma su operazioni di Select,Update...etc dirette...
Come nell'esempio che ti ho scritto....
Ciao
22 messaggi dal 05 febbraio 2009
spe... la dichiarazione di un cursore [che gia' e' una cosa aberrante di suo  ]

E allora come dovrei scrivere quel loop??
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
andrea99999 ha scritto:
spe... la dichiarazione di un cursore [che gia' e' una cosa aberrante di suo  ]

E allora come dovrei scrivere quel loop??


non e' che ci abbia capito molto  , ma da quello che vedo ti basterebbe cercare direttamente il "minimo"..
SELECT MIN(...) AS [pippo] FROM ... WHERE ...
ma non ho capito come hai strutturato il tutto...
poi, quando hai il minimo ([pippo]), puoi farci cio' che credi.. anche verificare che tale minimo (sempre [pippo]) sia "congruo" con quanto ti aspetti.. ad esempio se la tua distanza minima e' 1km ma ottieni 10km, allora potrai sollevare un'eccezione o quant'altro..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.