2017-01-31 2 views
0

У меня есть переменная, которую я населяющих из отборного заявления (@ENTY_TABLE_NAME):объявленная переменная не рассматривается как заявил

DECLARE @ENTY_TABLE_NAME varchar(500) 
DECLARE @ENTY_ID INT; 
DECLARE @FIELD_ID INT; 
DECLARE @VALUE VARCHAR(50); 

SET @ENTY_ID = 1 
SET @FIELD_ID = 90 
SET @VALUE = '0' 

SET @ENTY_TABLE_NAME = 
(SELECT TOP 1 ENTY_TABLE_NAME 
FROM ENTY 
WHERE [email protected]_ID); 

SELECT DISTINCT ATTR_VAL 
FROM @ENTY_TABLE_NAME _ATTR 
WHERE FIELD_ID= @FIELD_ID AND ATTR_VAL LIKE'%' + @VALUE + '%' 
ORDER BY ATTR_VAL 

После того как я пытаюсь использовать другой оператор выбора, но она возвращается сообщение об ошибке :

Msg 1087, Level 16, State 1, Line 26 
Must declare the table variable "@ENTY_TABLE_NAME". 

Почему я говорю, что я не объявлял переменную, что я объявляю факт? Как это исправить?

+1

Это говорит вам, что вы не объявили * таблица * переменная (переменная является переменной 'varchar'). Вы не можете выбрать из переменной, как вы пытаетесь. – Jerrad

ответ

6

Проблема не в том, что переменная не объявлена. Проблема заключается в том, что вы не можете использовать переменную в качестве имени таблицы в регулярном выражении SQL (если только переменная не является переменной таблицы).

Если имя таблицы должно быть переменной, а затем использовать динамический SQL:

declare @sql nvarchar(max); 

set @sql = ' 
SELECT DISTINCT ATTR_VAL 
FROM @ENTY_TABLE_NAME _ATTR 
WHERE FIELD_ID = @FIELD_ID AND ATTR_VAL LIKE ''%'' + @VALUE + ''%''' 
ORDER BY ATTR_VAL'; 

set @sql = replace(@sql, '@ENTY_TABLE_NAME', ENTY_TABLE_NAME); 

exec sp_executesql @sql, N'@FIELD_ID int, @VALUE varchar(50)', @FIELD_ID = @FIELD_ID, @VALUE = @VALUE; 
Смежные вопросы