2012-02-23 15 views
5

¿Alguien puede comprobar en mi declaración ...Declaración de variables SQL - SQL Server

DECLARE @tblName varchar(MAX), 
     @strSQL varchar(MAX) 

SET @tblName ='SELECT DISTINCT o.name as TableName 
       FROM sysobjects o 
       JOIN sysindexes x on o.id = x.id 
       WHERE o.name LIKE ''%empty%''' 

SET @strSQL = 'INSERT INTO @tblName VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

mi error es ...

Msg 1087, nivel 15, estado 2, línea 1
Debe declarar la variable de la tabla "@tblName".

Lo que quiero hacer es conseguir el nombre de tabla en la variable @tblName e insertar algunos datos en @strSQL variables

Por ejemplo ... el resultado en @tblName es CustomerInfo

después en @strSQL I va a utilizar el resultado en @tblName como el nombre de mi tabla en mi comando Insertar.

Así que la variable @strSQL será;

INSERT INTO CustomerInfo VALUES(......) 
+1

posible duplicado de [SQL Declare Variables] (http://stackoverflow.com/questions/9407703/sql-declare-variables) –

Respuesta

2

Pruebe esto desde mi respuesta a su otra pregunta:

SELECT TOP 1 @tblName = t.name 
FROM sys.tables t 
INNER JOIN sys.indexes i on i.object_id = t.object_id 
WHERE t.name LIKE '%empty%' 

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

Eres todavía no mencionar la versión de SQL Server que está utilizando. Pero a partir de SQL Server 2005 o posterior, debe dejar de usar sysobjects y sysindexes; en su lugar, utilice el nuevo esquema sys que contiene más o menos la misma información, pero que es más fácil de obtener.

Consulte [MSDN: consultar el catálogo del sistema del servidor SQL] [1] para obtener mucha más información sobre lo que está disponible en el nuevo esquema sys y cómo aprovecharlo al máximo.

+0

Vaya, mi problema, estoy usando SQL Servidor 2008, sin embargo ... gracias 4 d ayuda –

+0

otra cosa ... qué pasa si voy a utilizar una declaración IF en @strSQL antes del comando Insertar porque quiero verificar primero si los valores que voy a insertar en no existente en la tabla. lo siento por muchas preguntas ... porque estoy empezando a estudiar el sql. –

2

Cuando se declara más de una variable con una sola instrucción DECLARE, you only put the type once (al final):

DECLARE @tblName, @strSQL varchar(MAX) 
+0

Podría haber jurado que la pregunta original era sobre MySql (que es lo que respondí). Parece que el Servidor SQL permite definiciones de tipo duplicadas en las declaraciones DECLARAR – colithium

+0

. Esta respuesta es incorrecta. SQL Server NO permite 'DECLARE @tblName, @strSQL varchar (MAX)'. Uno * debe * especificar el tipo de cada variable como: 'declare @i int, @t varchar (max);' –

1

Esto debe ser algo realmente puede funcionar:

DECLARE @tblName varchar(MAX), 
     @strSQL varchar(MAX) 

SET @tblName = (SELECT DISTINCT TOP 1 o.name as TableName 
       FROM sysobjects o 
       JOIN sysindexes x on o.id = x.id 
       WHERE o.name LIKE '%empty%') 

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

Cualquier cosa en quote significa que es una cadena y no espera que el servidor sql lo ejecute como una declaración, lo mismo para la variable en una cadena, no puede citarlo

+0

'DSINTINCT' ** y **' TOP 1' es un poco demasiado ... si solo tiene 1 resultado, no es posible tener duplicados de todos modos ... –

+0

Solo quiero asegurarme de que no se bloquee ya que puede haber alguna tabla diferente que tenga un nombre similar –