2012-05-24 23 views
5

È possibile passare il nome della tabella come parametro di input alla stored procedure?Nome della tabella di passaggio nella stored procedure sql

Ad esempio:

create procedure test 
@tablename char(10) 
as 
begin 
select * from @tablename 
end 
go 

So che questo non funziona. Quindi qual è il modo migliore se voglio passare il nome della tabella nella stored procedure?

Molte grazie

risposta

10

Il modo più sicuro per farlo è tramite una vista.

Creare una vista che unioni tutte le tabelle a cui si desidera accedere (e che devono avere tutte la stessa struttura di colonna) e anteporre le righe al nome della tabella.

CREATE VIEW MultiTable 
AS 
    SELECT 'table1' AS TableName, * FROM table1 
    UNION ALL 
    SELECT 'table2' AS TableName, * FROM table2 
    UNION ALL 
    SELECT 'table3' AS TableName, * FROM table3 

tuo stored procedure può filtrare sul nome della tabella:

CREATE PROCEDURE test 
    @TableName varchar(100) 
AS 
    SELECT * FROM MultiTable WHERE TableName = @TableName 

Questo è più sicuro che usare la creazione di SQL dinamico e l'esecuzione.

+0

Grazie mille. – gunnerz

+1

Si noti che, utilizzando "*", l'esempio presuppone che tutte e tre le tabelle abbiano lo stesso numero di colonne. Credo che otterresti un errore altrimenti. Anche se fosse così, come best practice dovresti probabilmente elencarli in ogni SELECT. – Buggieboy

+0

@Buggieboy potrebbe ricevere questo errore se le colonne sono modifiche solo in una delle tabelle è utile ........ –

3

È necessario utilizzare l'SQL dinamico, ma è necessario essere consapevoli dei potenziali rischi di iniezione in SQL che si aprono come se @tablename contenesse qualcosa di poco sicuro, si potrebbe finire in un mondo di dolore.

ad es.

-- basic check to see if a table with this name exists 
IF NOT EXISTS(SELECT * FROM sys.tables WHERE name = @tablename) 
    RETURN 

DECLARE @sql NVARCHAR(100) 
SET @sql = 'SELECT * FROM ' + QUOTENAME(@tablename) 
EXECUTE(@sql) 

È necessario essere molto attenti con questo approccio, assicurarsi di non aprire una lattina di worm di sicurezza.

Un'altra mia preoccupazione è che si stia tentando di rendere generici i dati di accesso sproc che di solito è una cattiva idea. Ovviamente non conosco il tuo caso d'uso.

+1

[Il tuo è il caso numero uno!] (Http://www.sommarskog.se/dynamic_sql. html # Common_cases) – Bridge

+0

Grazie mille. C'è una possibilità quasi trascurabile di injection SQL perché non esiste una voce utente per il nome della tabella. Viene utilizzato solo internamente dall'applicazione e voglio evitare di creare più copie memorizzate con la stessa logica tranne i nomi di tabelle differenti – gunnerz

+1

@Bridge: sì, sono completamente d'accordo. I casi in cui ho veramente bisogno di usare un nome di tabella dinamico, personalmente ho generato l'SQL nel codice dell'applicazione. Ma spesso non ho trovato un caso d'uso reale – AdaTheDev

2
DECLARE @Name VARCHAR(50) 
SET @Name='Company' 

EXEC('SELECT * from ' + @Name) 

utilizzare in questo modo per ottenere record dal database.

Problemi correlati