【问题标题】:How to insert into a table variable with a dynamic query?如何使用动态查询插入表变量?
【发布时间】:2015-09-02 17:01:01
【问题描述】:

我尝试使用临时表来开发这个存储过程,但这不起作用,所以我转而使用表变量。我需要对表变量执行临时动态查询,然后使用该表变量执行最终查询。问题是我收到一个错误“必须声明标量变量@clms”。我假设 Exec 没有表变量的范围?

DECLARE @qry nvarchar(4000)
DECLARE @clms TABLE (mastcatname nvarchar(50),engdtlbeta decimal (18,4))
SET @qry='INSERT INTO @clms 
          SELECT distinct replace(mastcatname, '' '', '''') as mastcatname, 
                 engdtlbeta 
          FROM vw_Scorecard 
          WHERE empsurveyid=' + cAST(@EmpSurveyID AS nvarchar(10)) + ' 
               AND UnitID IN (' + @UnitIDs + ') 
          ORDER BY engdtlbeta desc, MastCatName'

EXEC(@qry)

DECLARE @cols nvarchar(1000)
SELECT @cols=COALESCE (@cols + ',[' + mastcatname + ']', '[' + mastcatname + ']') 
FROM @clms


SET @qry='SELECT UnitName ,
                 ParentName, ' + @cols + ' 
          FROM (
                SELECT UnitName,
                    ParentName, 
                    ScoreAvg, 
                    replace(mastcatname, '' '','''') as mastcatname 
                FROM vw_Scorecard 
                WHERE UnitID IN (' + @UnitIDs + ') 
                    AND EmpSurveyID=' + cast(@EmpSurveyID as nvarchar(5)) + ' ) p
          PIVOT
            (SUM(ScoreAvg) FOR mastcatname in (' + @cols + ')) as pvt'

EXEC (@qry)

【问题讨论】:

  • 请不要使用字符串连接来为您的动态查询添加参数。使用带参数的sp_executesql
  • 你的假设是正确的。为什么临时表不起作用?
  • @UnitIDs 来自哪里?你能把这些值放到另一个表变量中吗?那么第一个查询就不需要动态 SQL。

标签: sql sql-server-2008


【解决方案1】:

这是一个简单的最小示例。您可以使用INSERT EXEC 语句。关键是在动态查询内部和外部声明表变量。在动态查询结束时,只需从表变量中选择并将结果集插入到外部表变量中:

DECLARE @t TABLE ( id INT ) 

DECLARE @q NVARCHAR(MAX) = 'declare @t table(id int) 
                            insert into @t values(1),(2) 
                            select * from @t'

INSERT INTO @t
EXEC(@q)

SELECT * FROM @t

【讨论】:

  • INSERT-EXEC 不再被允许,它的错误是“不能嵌套一个 INSERT EXEC 语句”
  • @NateN,这个错误意味着完全不同的事情。请在投票前检查。 Insert exec 本身非常好并且被允许。
【解决方案2】:

我发现这试图做基本相同的事情。我修改了我的 SQL,是的,它有效!但后来我想,这太复杂了。为什么要在动态SQL中声明表变量,插入,然后全选?为什么不直接选择...

DECLARE @t TABLE ( id INT ) 

DECLARE @q NVARCHAR(MAX) = 'select 1 union select 2'

INSERT INTO @t
EXEC(@q)

SELECT * FROM @t

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2023-01-14
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多