variable the stored query nombre must escalar error dinamico declarar sql sql-server tsql variables

the - Declare variables de SQL



query dinamico sql server (2)

¿Alguien puede verificar mi declaración ...

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 tabla "@tblName".


No estoy seguro de lo que estás tratando de hacer, pero creo que quieres algo como esto:

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)

Dicho esto, todavía hay un par de cosas a tener en cuenta aquí. Debe manejar la condición en la que SELECT DISTINCT devuelve algo que no sea un solo registro. Además, no entiendo realmente la necesidad de crear SQL dinámico (en @strSQL ) cuando @tblName siempre tendrá el mismo valor (ya que no se utilizan variables en la cláusula WHERE ).


Su propiedad @tblName existe en el ámbito externo, el alcance de sus líneas de código "normales", pero no en el ámbito interno del SQL que está construyendo en la cadena allí ...

Necesitas cambiar tus líneas para leer:

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

y entonces debería funcionar bien.

Además, no está mencionando su versión de SQL Server, pero a partir de SQL Server 2005 o más reciente, debe dejar de usar sysobjects y sysindexes ; en su lugar, use el nuevo esquema de sys que contiene más o menos la misma información, pero más fácilmente disponible. Cambie su consulta a:

SET @tblName =''SELECT DISTINCT t.name as TableName FROM sys.tables t INNER JOIN sys.indexes i on i.object_id = t.object_id WHERE t.name LIKE ''''%empty%''''''

Consulte MSDN: consulte el catálogo del sistema de SQL Server para obtener más información sobre lo que está disponible en el nuevo esquema de sys y cómo aprovechar al máximo.

Como señaló "rsbarro": poner esta declaración SQL aquí entre comillas es extraño. ¿Está ejecutando esta declaración usando EXEC(...) también? Pero entonces, ¿cómo asigna el valor a la propiedad @tblName ? Realmente no tiene sentido .....

Si desea ejecutar esta consulta para obtener un valor, debe tener algo como esto:

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

Debe tener un TOP 1 allí para asegurarse de obtener un solo valor; de lo contrario, esta declaración podría fallar (si se seleccionan varias filas).