2009-08-24 44 views
11

Quiero escribir un proceso almacenado que usará un parámetro, que será el nombre de la tabla.SQL dinámico (pasar el nombre de la tabla como parámetro)

por ejemplo:

@tablename << Parameter 

SELECT * FROM @tablename 

¿Cómo es esto posible?

me escribió 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 sintaxis incorrecta cerca de @alias.

Respuesta

18

Bueno, primero has omitido el '+' de tu cadena. Esta forma de hacer las cosas no es la ideal, pero se puede hacer

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

me gustaría sugerir fuertemente repensar cómo se hace esto, sin embargo. Generar SQL dinámico 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.

1

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.

0

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 dinámico para parametrizar esos aspectos de una consulta.

Sin embargo, mirando el SQL, se tiene:

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

Sin duda, esto significaría que el código referida solamente seleccionar de una tabla llamada 'Tabla', y lo que se necesita para concatenar los @alias con ella - y en muchos dialectos SQL, la concatenación se indica por '||':

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

Esto probablemente todavía no hace lo que quiere - pero podría no generar un error de sintaxis cuando se crea el procedimiento (pero probablemente generaría un error en el tiempo de ejecución).

4

Vas a tener que hacerlo de esta manera: exec('select * from '[email protected]+' where...')

Pero asegúrese de entender 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.

+2

Es ligeramente mejor para envolver el nombre de la tabla entre corchetes para protegerse de los nombres de tabla que son palabras reservadas y/o incluir espacios en el nombre de la tabla. exec ('select * from [' + @ tablename + '] donde ...') –

3

No quiere decir

Exec('SELECT * FROM ' + @tableName) 

Además, el error que se obtiene es porque se le ha olvidado una + antes @alias.

Cuestiones relacionadas