SQL dynamic (pasar el nombre de la tabla como parámetro)

Quiero escribir un proceso almacenado que usará un parámetro, que será el nombre de la tabla.

P.ej:

@tablename << Parameter SELECT * FROM @tablename 

¿Cómo es esto posible?

Yo escribí esto:

 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 

Pero dice syntax incorrecta cerca de @Alias.

Bueno, primero has omitido el ‘+’ de tu cadena. Esta forma de hacer las cosas está lejos de ser ideal, pero puedes hacer

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

Sin embargo, te sugiero encarecidamente reconsiderar cómo haces esto. Generar SQL dynamic a menudo conduce a vulnerabilidades de inyección de SQL y dificulta que SQL Server (y otras bases de datos) resuelvan la mejor manera de procesar su consulta. Si tiene un procedimiento almacenado que puede devolver cualquier tabla, en realidad no obtiene prácticamente ningún beneficio de que se trate de un procedimiento almacenado, ya que no será capaz de hacer muchas cosas en cuanto a optimizaciones, y está en gran parte castrando los beneficios de seguridad también.

Tendrás que hacerlo así: exec('select * from '+@tablename+' where...')

Pero asegúrese de comprender completamente los riesgos, como los ataques de inyección SQL. En general, nunca debería tener que usar algo como esto si el DB está bien diseñado.

¿No quieres decir

 Exec('SELECT * FROM ' + @tableName) 

Además, el error que obtienes es porque has olvidado un + antes de @Alias.

A menudo, tener que parametrizar el nombre de la tabla indica que debe volver a pensar su esquema de base de datos. Si extrae preguntas de entrevistas de muchas tablas diferentes, probablemente sea mejor crear una tabla con una columna que distinga entre las preguntas de cualquier forma que tengan las diferentes tablas.

La mayoría de las implementaciones de SQL no le permiten especificar elementos estructurales (nombres de tablas, nombres de columnas, orden por columnas, etc.) a través de parámetros; debe usar SQL dynamic para parametrizar esos aspectos de una consulta.

Sin embargo, mirando el SQL, tienes:

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

Seguramente, esto significaría que el código solo seleccionará de una tabla llamada ‘Tabla’, y necesitaría concatenar los @Alias ​​con él, y en muchos dialectos SQL, la concatenación se indica con ‘ || ‘:

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

Es probable que esto todavía no haga lo que usted desea, pero podría no generar un error de syntax cuando se crea el procedimiento (pero probablemente generaría un error en el tiempo de ejecución).