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.
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 .
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'
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