I have a table variable in SQL Server 2008
DECLARE @specsAndModel TABLE
(
specName VARCHAR(50)
,specVal VARCHAR(50)
)
INSERT INTO @specsAndModel
VALUES('[modelNumber]', 'F00-B4R')
Then, I later build a string called @query, which I ultimately try to pass into EXECUTE, as in the following example:
DECLARE @query NVARCHAR(MAX);
SET @query = 'SELECT specName, specVal FROM @specsAndModel'
EXECUTE(@query)
However, SQL Server gives me the error message: Must declare the table variable "@specsAndModel".
After searching around, I think this might be related to the execution context, but I haven’t been able to resolve the problem.
Is it even possible for me to use a table variable in a call to the execute function?
The table you are creating is a table variable which is not available outside of its initial scope. There are a few ways to fix this:
Create a Global Temp Table (Disclaimer: this can cause problems if more that one user attempts to run this at the same time.):
Create a Local Temp Table instead of global:
Execute the create table inside of your dynamic SQL (ugly):
Instead of using a temp table, create an actual table and then drop it when done (Disclaimer: this can cause problems if more that one user attempts to run this at the same time.):
Here is an link to a discussion about temp tables and table variables:
Should I use a #temp table or a @table variable?
Edit: You can pass in a table variable using
sp_executesql:Using either the global ##temp tables and a permanent table run risks in that if more than one users attempts to run the process, there could be conflicts.
You are safer using either a local #temp table or passing the table variable using
sp_executesql.