2010-05-25 71 views
7

Quiero crear tablas SQL de respaldo usando nombres de variables.Crear una tabla SQL usando el nombre de variable dinámica

algo en la línea de

DECLARE @SQLTable Varchar(20) 
SET @SQLTable = 'SomeTableName' + ' ' + '20100526' 
SELECT * INTO quotename(@SQLTable) 
FROM SomeTableName 

pero yo estoy

Incorrect syntax near '@SQLTable'.

Es sólo parte de un pequeño guión de la pensión alimenticia, así que no tiene que preocuparse acerca de las inyecciones.

Respuesta

10
DECLARE @MyTableName nvarchar(20); 
DECLARE @DynamicSQL nvarchar(1000); 

SET @MyTableName = "FooTable"; 


SET @DynamicSQL = N'SELECT * INTO ' + @MyTableName + ' FROM BarTable'; 

EXEC(@DynamicSQL); 
+5

@DynamicSQL exec 'FooTable' debe ser: exec (@DynamicSQL); - sin el paréntesis, arroja "nombre no es un identificador válido". – plditallo

+1

Tengo el mismo resultado que @plditallo. Sin el paréntesis, aparece el error: "No se pudo encontrar el procedimiento almacenado ..." EXEC sin corchetes intenta llamar a un procedimiento. https://stackoverflow.com/questions/8382753/calling-exec-generates-error-could-not-find-stored-procedure –

6

Desafortunadamente, no puede usar variables de enlace para nombres de tablas, columnas, etc. En este caso debe generar SQL dinámico y usar exec.

4
DECLARE @Script NVARCHAR(MAX); 
SET @Script = N'SELECT * INTO SomeTableName_' + N'20100526' + N' FROM SomeTableName'; 
EXEC sp_executesql @Script 

He dejado la fecha por separado, ya que supongo que desea calcularla para cada ejecución.

4

Usted debe mirar en uso de sinónimos:

- Crear un sinónimo de la tabla Producto en AdventureWorks2008R2. CREAR SINÓNIMO MyProduct PARA AdventureWorks2008R2.Production.Product; GO

- Consulta la tabla Producto utilizando el sinónimo. USE tempdb; GO SELECCIONAR ProductID, nombre FROM MyProduct DONDE ProductID < 5; GO

http://msdn.microsoft.com/en-us/library/ms177544.aspx

+0

+1 para una gran idea! – Vaccano

0
DECLARE @MyTableName nvarchar(20); 
DECLARE @DynamicSQL nvarchar(1000); 

SET @MyTableName = "FooTable"; 


SET @DynamicSQL = N'SELECT * INTO ' + @MyTableName + ' FROM BarTable'; 

exec @DynamicSQL; 

esta consulta es correcta, pero sólo tiene que utilizar comilla simple en el ("FooTable") =

Cuestiones relacionadas