Como definir o nome da tabela na consulta SQL dinâmica?

Eu quero definir o nome da tabela em uma consulta SQL dinâmica. Eu tentei com sucesso para o parâmetro da seguinte forma:

/* 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 

Agora quero usar o TABLE NAME dinamicamente usando um parâmetro, mas não consegui fazer isso. Por favor me guie.

Nomes de tabelas não podem ser fornecidos como parâmetros, então você terá que construir a string SQL manualmente assim:

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

No entanto, certifique-se de que seu aplicativo não permita que um usuário insira diretamente o valor de @TableName , pois isso tornaria sua consulta suscetível a injeção de SQL. Para uma possível solução para isso, veja esta resposta .

Para ajudar a proteger contra injeção de SQL, normalmente tento usar funções sempre que possível. Neste caso, você poderia fazer:

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

Tente isto:

 /* 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