Объявление переменных SQL - SQL Server - PullRequest
5 голосов
/ 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".

Я хочу получить имя таблицы в переменной @tblName и вставить некоторые данные в @strSQL переменную

Например ... результат в @tblName равен CustomerInfo

, затем в @strSQL я буду использовать результат в @tblName в качестве имени таблицы в моей команде вставки.

Таким образом, переменная @strSQL будет;

INSERT INTO CustomerInfo VALUES(......)

Ответы [ 3 ]

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

Попробуйте это из моего ответа на ваш другой вопрос:

 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)

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

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

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

Когда вы объявляете более одной переменной с помощью одного оператора DECLARE, вы помещаете тип только один раз (в конце):

DECLARE @tblName, @strSQL varchar(MAX)
1 голос
/ 23 февраля 2012

Это должно быть что-то, что действительно может работать:

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)

Все, что в кавычках означает, что это строка, и не ожидайте, что SQL Server выполнит ее как оператор, то же самое относится к переменной в строкецитирую

...