【问题标题】:Why I can't use template table in dynamic query SQL SERVER 2005为什么我不能在动态查询 SQL SERVER 2005 中使用模板表
【发布时间】:2011-03-01 03:14:21
【问题描述】:

我有以下生成错误的 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".
查询有什么问题。如何解决?

【问题讨论】:

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


    【解决方案1】:

    变量@table 超出范围。您要么必须创建一个全局临时表 ##table,要么在动态 SQL 中声明该表。

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

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

    【讨论】:

    • 能否分享一段代码如何使用全局模板表修改查询
    【解决方案2】:

    如果表变量是在 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
    

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多