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

Je veux définir le nom de la table dans une requête SQL dynamique. J'ai essayé avec succès pour 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 dynamiquement en utilisant un paramètre mais j'ai échoué à le faire. Merci de me guider.

21
demandé sur TT. 2013-12-19 14:10:29

3 réponses

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
répondu Dan 2017-10-20 11:07:20

Pour me prémunir contre L'injection SQL, j'essaie normalement d'utiliser des fonctions autant que possible. Dans ce cas, vous pouvez 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' 
22
répondu user1172173 2015-03-16 17:04:14

Essayez ceci:

/* 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
répondu Saharsh Shah 2013-12-19 10:12:46