>Grazie, ho risolto! Ho modificato la procedura in questo modo,
>ed ora funziona esattamente come volevo:
>
>CREATE PROCEDURE [dbo].[test] (
>@tab varchar (50))
>AS
>EXEC ('
>SELECT * FROM '+@tab+'
>')
>
>
Ne sei proprio sicuro?
Guarda come è semplice effettuare un attacco di SQL Injection con la tua stored procedure:
USE tempdb;
CREATE TABLE dbo.Students(
StudentID int NOT NULL IDENTITY PRIMARY KEY,
FirstName varchar(10) NOT NULL,
LastName varchar(10) NOT NULL
);
INSERT dbo.Students VALUES('Lorenzo', 'Benaglia');
INSERT dbo.Students VALUES('Luca', 'Bianchi');
INSERT dbo.Students VALUES('Andrea', 'Montanari');
INSERT dbo.Students VALUES('Gianluca', 'Hotz');
GO
CREATE PROCEDURE dbo.up_GetData(
@Table sysname
)
AS
EXEC ('SELECT * FROM ' + @Table);
GO
EXEC dbo.up_GetData N'dbo.Students';
/* Output:
StudentID FirstName LastName
----------- ---------- ----------
1 Lorenzo Benaglia
2 Luca Bianchi
3 Andrea Montanari
4 Gianluca Hotz
(4 row(s) affected)
*/
/* Simulo un attacco di SQL Injection */
EXEC dbo.up_GetData N'dbo.Students; DROP TABLE dbo.Students;';
/* Output:
StudentID FirstName LastName
----------- ---------- ----------
1 Lorenzo Benaglia
2 Luca Bianchi
3 Andrea Montanari
4 Gianluca Hotz
(4 row(s) affected)
*/
EXEC dbo.up_GetData N'dbo.Students';
/* Output:
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.Students'.
*/
DROP PROCEDURE dbo.up_GetData;
Rileggi CON MOLTISSIMA ATTENZIONE l'articolo di Erland che ti ho indicato, ed evita di adottare soluzioni PERICOLOSE come quella che hai postato.
Mi spieghi che male c'è nello scrivere 10 o 100 stored procedure invece di 1 sola?
Oltre ad ottenere indubbi vantaggi prestazionali dovuti al riutilizzo dei piani di esecuzione, ti metteresti al riparo da questi gravi problemi di sicurezza.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org