SQL объявляет переменные - программирование
Подтвердить что ты не робот

SQL объявляет переменные

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

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)

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

Msg 1087, уровень 15, состояние 2, строка 1
Должен объявить переменную таблицы "@tblName".

4b9b3361

Ответ 1

Свойство @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 для уверенного, чтобы получить только одно значение - иначе этот оператор может выйти из строя (если выбрано несколько строк).

Ответ 2

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

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 нет переменных).