2009-08-24 8 views
11

Je veux écrire un proc stocké qui utilisera un paramètre, qui sera le nom de la table.SQL dynamique (en passant le nom de la table en tant que paramètre)

par exemple:

@tablename << Parameter 

SELECT * FROM @tablename 

Comment est-ce possible?

j'ai écrit ceci:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[GetAllInterviewQuestions] 
@Alias varchar = null 
AS 
BEGIN 
Exec('Select * FROM Table as ' @Alias) 
END 

Mais il dit une syntaxe incorrecte près @Alias.

Répondre

18

Eh bien, tout d'abord, vous avez omis le '+' de votre chaîne. Cette façon de faire est loin d'être idéal, mais vous pouvez faire

DECLARE @SQL varchar(250) 
SELECT @SQL = 'SELECT * FROM ' + QuoteName(@Alias) 
Exec(@SQL) 

Je suggère fortement repenser la façon dont vous faites cela, cependant. La génération de SQL dynamique entraîne souvent des vulnérabilités d'injection SQL et complique le traitement de votre requête par SQL Server (et d'autres DB). Si vous avez une procédure stockée qui peut renvoyer n'importe quelle table, vous n'obtiendrez pratiquement aucun avantage car il s'agit d'une procédure stockée car elle ne pourra pas faire grand-chose en termes d'optimisations, et vous êtes largement émasculer les avantages de sécurité aussi.

1

Souvent, le fait de devoir paramétrer le nom de la table indique que vous devriez repenser votre schéma de base de données. Si vous tirez des questions d'entrevue à partir de nombreuses tables différentes, il est probablement préférable de créer une table avec une colonne faisant la distinction entre les questions de la façon dont les différentes tables auraient.

0

La plupart des implémentations de SQL ne vous permettent pas de spécifier des éléments structurels - noms de tables, noms de colonnes, ordre par colonnes, etc. - via les paramètres; vous devez utiliser SQL dynamique pour paramétrer ces aspects d'une requête.

Cependant, en regardant le SQL, vous avez:

Exec('SELECT * FROM Table AS ' @Alias) 

Certes, cela signifierait que le code ne jamais choisir parmi une table appelée « Table », et vous devrez concaténer les @Alias avec elle - et dans de nombreux dialectes SQL, concaténation est indiqué par « || »:

Exec('SELECT * FROM Table AS ' || @Alias) 

Cela ne reste probablement pas ce que vous voulez - mais il peut ne pas générer une erreur de syntaxe lorsque la procédure est créée (mais cela générerait probablement une erreur à l'exécution).

4

Vous devrez le faire comme ceci: exec('select * from '[email protected]+' where...')

Mais assurez-vous de bien comprendre les risques, comme les attaques par injection SQL. En général, vous ne devriez jamais avoir à utiliser quelque chose comme ça si la base de données est bien conçue.

+2

Il est légèrement préférable d'entourer le nom de la table entre crochets pour vous protéger des noms de table qui sont des mots réservés et/ou inclure des espaces dans le nom de la table. exec ('select * from [' + @ tablename + '] où ...') –

3

Ne pas vous dire

Exec('SELECT * FROM ' + @tableName) 

En outre, l'erreur que vous obtenez est parce que vous avez oublié un + avant @Alias.

Questions connexes