SQL объявляет переменные - PullRequest
16 голосов
/ 23 февраля 2012

Может кто-нибудь проверить мое заявление ...

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)

моя ошибка ...

Сообщение 1087, Уровень 15, Состояние 2, Строка 1
Необходимо объявить табличную переменную "@tblName".

Ответы [ 2 ]

12 голосов
/ 23 февраля 2012

Ваше свойство @tblName существует во внешней области видимости - области ваших "нормальных" строк кода - но не во внутренней области SQL, которую вы строите в этой строке ....

Вам нужно изменить ваши строки следующим образом:

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

, и тогда все будет работать нормально.

Кроме того, вы упоминаете не версию SQL Server, а SQL Server.2005 или новее, вы должны прекратить использовать sysobjects и sysindexes - вместо этого используйте новую схему sys, которая содержит более или менее ту же информацию - но более доступную.Измените свой запрос на:

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

См. MSDN: Запрос к системному каталогу SQL Server , чтобы получить гораздо больше информации о том, что доступно в новой схеме sys, и о том, как максимально использоватьоб этом!

Как указал "rsbarro": помещать этот оператор SQL в кавычки странно - вы выполняете этот оператор, используя EXEC(...) тоже ??Но тогда как вы присваиваете значение обратно свойству @tblName?Не имеет смысла .....

Если вы хотите выполнить этот запрос, чтобы получить значение, у вас должно быть что-то вроде этого:

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

Вам нужно иметьTOP 1 там должно быть обязательно , чтобы получить только одно значение - в противном случае этот оператор может завершиться ошибкой (если выбрано несколько строк).

6 голосов
/ 23 февраля 2012

Не совсем точно, что вы пытаетесь сделать, но я думаю, вы хотите что-то вроде этого:

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)

При этом, есть еще пара вещей, на которые стоит обратить внимание. Вам необходимо обработать условие, когда SELECT DISTINCT возвращает что-либо, кроме одной записи. Кроме того, я не совсем понимаю необходимость построения динамического SQL (в @strSQL), когда @tblName всегда будет иметь одинаковое значение (поскольку в предложении WHERE нет переменных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...