Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 为什么不能在动态查询SQL SERVER 2005中使用模板表_Sql Server 2005_Tsql_Dynamic Sql - Fatal编程技术网

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

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 @

我有以下生成错误的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) 错误是必须声明表变量@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

您能否分享一段代码,说明如何使用全局模板表修改查询