Sql server 2005 为什么不能在动态查询SQL SERVER 2005中使用模板表
我有以下生成错误的t-sql代码Sql server 2005 为什么不能在动态查询SQL SERVER 2005中使用模板表,sql-server-2005,tsql,dynamic-sql,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 @
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)
错误是必须声明表变量@table。
这个问题出了什么问题。如何修复它?变量@table超出范围。您要么创建一个全局临时表,要么在动态SQL中声明该表
如果您打算使用动态SQL,我建议您阅读这篇优秀的文章
如果表变量是在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
您能否分享一段代码,说明如何使用全局模板表修改查询