web-dev-qa-db-fra.com

Comment définir le nom de la table dans une requête SQL dynamique?

Je souhaite définir le nom de la table dans une requête SQL dynamique. J'ai essayé avec succès le paramètre comme suit:

/* Using sp_executesql */
/* Build and Execute a Transact-SQL String with a single parameter 
value Using sp_executesql Command */

/* Variable Declaration */
DECLARE @EmpID AS SMALLINT
DECLARE @SQLQuery AS NVARCHAR(500)
DECLARE @ParameterDefinition AS NVARCHAR(100)
/* set the parameter value */
SET @EmpID = 1001
/* Build Transact-SQL String by including the parameter */
SET @SQLQuery = 'SELECT * FROM tblEmployees WHERE EmployeeID = @EmpID' 
/* Specify Parameter Format */
SET @ParameterDefinition =  '@EmpID SMALLINT'
/* Execute Transact-SQL String */
EXECUTE sp_executesql @SQLQuery, @ParameterDefinition, @EmpID

Maintenant, je veux prendre TABLE NAME en utilisant dynamiquement un paramètre mais je n'ai pas réussi à le faire. Guidez-moi s'il-vous-plaît.

21
Neo

Les noms de table ne peuvent pas être fournis en tant que paramètres, vous devrez donc construire la chaîne SQL manuellement comme ceci:

SET @SQLQuery = 'SELECT * FROM ' + @TableName + ' WHERE EmployeeID = @EmpID' 

Cependant, assurez-vous que votre application ne permet pas à un utilisateur d'entrer directement la valeur de @TableName, car cela rendrait votre requête sensible à l'injection SQL. Pour une solution possible à cela, voir cette réponse .

27
Dan

Pour aider à se prémunir contre l'injection SQL, j'essaie normalement d'utiliser des fonctions dans la mesure du possible. Dans ce cas, vous pourriez faire:

...
SET @TableName = '<[db].><[schema].>tblEmployees'
SET @TableID   = OBJECT_ID(TableName) --won't resolve if malformed/injected.
...
SET @SQLQuery = 'SELECT * FROM ' + OBJECT_NAME(@TableID) + ' WHERE EmployeeID = @EmpID' 
29
user1172173

Essaye ça:

/* Variable Declaration */
DECLARE @EmpID AS SMALLINT
DECLARE @SQLQuery AS NVARCHAR(500)
DECLARE @ParameterDefinition AS NVARCHAR(100)
DECLARE @TableName AS NVARCHAR(100)
/* set the parameter value */
SET @EmpID = 1001
SET @TableName = 'tblEmployees'
/* Build Transact-SQL String by including the parameter */
SET @SQLQuery = 'SELECT * FROM ' + @TableName + ' WHERE EmployeeID = @EmpID' 
/* Specify Parameter Format */
SET @ParameterDefinition =  '@EmpID SMALLINT'
/* Execute Transact-SQL String */
EXECUTE sp_executesql @SQLQuery, @ParameterDefinition, @EmpID
4
Saharsh Shah

C'est le meilleur moyen d'obtenir un schéma de manière dynamique et de l'ajouter aux différentes tables d'une base de données afin d'obtenir d'autres informations de manière dynamique

select @sql = 'insert #tables SELECT' '[' '+ SCHEMA_NAME (schema_id) +' '.' '+ name +' ']' 'AS SchemaTable FROM sys.tables'

exec (@sql)

bien sûr, #tables est une table dynamique dans la procédure stockée

0
CA Martin