Reputation: 7532
I have a variable that I am populating from a select statement(@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 ENTY.ENTY_ID=@ENTY_ID);
SELECT DISTINCT ATTR_VAL
FROM @ENTY_TABLE_NAME _ATTR
WHERE FIELD_ID= @FIELD_ID AND ATTR_VAL LIKE'%' + @VALUE + '%'
ORDER BY ATTR_VAL
After I am trying to use another select statement but it is returning an error:
Msg 1087, Level 16, State 1, Line 26
Must declare the table variable "@ENTY_TABLE_NAME".
Why is it saying I haven't declared a variable that I have an fact declared? How do I fix this?
Upvotes: 0
Views: 183
Reputation: 1269633
The problem is not that the variable is not declared. The problem is that you cannot use a variable as a table name in a regular SQL statement (unless the variable is a table variable).
If the table name needs to be a variable, then use dynamic 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;
Upvotes: 6