为什么我不能在动态查询SQL SERVER 2005中使用模板表

时间:2010-06-08 11:59:30

标签: sql-server-2005 tsql dynamic-sql

我有以下t-sql代码生成错误

Declare @table TABLE
(
    ID1 int,
    ID2 int
)

INSERT INTO @table values(1, 1); INSERT INTO @table values(2, 2); INSERT INTO @table values(3, 3);

DECLARE @field varchar(50); SET @field = 'ID1'

DECLARE @query varchar(MAX); SET @query = 'SELECT * FROM @table WHERE ' + @field + ' = 1' EXEC (@query)

错误是Must declare the table variable "@table".
查询有什么问题。如何解决?

2 个答案:

答案 0 :(得分:1)

变量@table超出范围。您可能必须创建全局临时表##table或在动态SQL中声明该表。

如果您打算使用动态SQL,我建议您阅读这篇优秀文章。

http://www.sommarskog.se/dynamic_sql.html

答案 1 :(得分:1)

如果表变量是在EXEC语句或sp_executesql存储过程之外创建的,则不能使用EXEC语句或sp_executesql存储过程来运行引用表变量的动态SQL Server查询。由于表变量只能在其本地作用域中引用,因此EXEC语句和sp_executesql存储过程将超出表变量的作用域。但是,您可以创建表变量并在EXEC语句或sp_executesql存储过程中执行所有处理,因为表变量本地作用域位于EXEC语句或sp_executesql存储过程中。

尝试这可能适合您:

DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);

create TABLE #table 
(
    ID1 varchar(30),
    ID2 int
)

INSERT INTO #table values(1, 1);
INSERT INTO #table values(1, 2);
INSERT INTO #table values(1, 3);



DECLARE @field varchar(30);
SET @field = 'ID1'

SET @SQLString = N'SELECT * FROM #table WHERE  @fld  = 1';
SET @ParmDefinition = N'@fld varchar(30)';

DECLARE @query varchar(MAX);
SET @query = 'SELECT * FROM #table WHERE ' + @field + ' = 1'
EXEC (@query)

drop table #table