【问题标题】:Insert result of executing dynamic query into a table将执行动态查询的结果插入表中
【发布时间】:2012-12-08 17:24:50
【问题描述】:

我有一个动态查询@strQuery,它在执行时会给出一个包含很多列的结果。 我想将此动态查询的结果插入到临时表中。 我这样做是因为我想对临时表执行一些过滤并获得所需的结果。

在之前的帖子HERE 上提出了类似的问题 首先创建一个临时表,然后使用INSERT INTO插入数据。

由于列列表很长,而且我不知道字段的数据类型,我想避免这一步。

select * into #tmh from
exec(@strQuery)

错误信息

关键字“exec”附近的语法不正确。

如何做到这一点?有可能以这种方式完成吗?如果没有,请指定其他替代方法以将执行动态查询的结果存储到表中。 谢谢。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    我以前遇到过这种情况,这就是我所做的:

    DECLARE @strQuery nVarchar(100)
    
    SET @strQuery='SELECT * into [tempdb].[dbo].[temptable] FROM YourTable'
    
    EXECUTE sp_executesql @strQuery
    
    SELECT * FROM [tempdb].[dbo].[temptable]
    
    DROP TABLE [tempdb].[dbo].[temptable]
    

    它工作正常。不要问我为什么是 FQ 表名而不是 #temptable。我不知道。这是行不通的。我可以让它工作的唯一方法是使用 [tempdb].[dbo].[temptable]

    【讨论】:

    • 有没有办法在不改变我原来的动态查询的情况下做到这一点?太复杂了
    • 我尝试了很多方法,但找不到使用 SELECT INTO 动态创建临时表的有效解决方案。动态SQL不会有太大变化。您只需在 FROM 之前添加“到
    • 试过...它不起作用,有没有办法在不知道除了 Select * into 之外的架构的情况下创建表..
    • 它不工作还不够。在此处发布您的动态 SQL
    • 这对我来说很好用!但是以这种方式创建临时表是否会改变它的行为方式(例如并发连接会发生冲突)还是仍然受到当前范围的限制?
    【解决方案2】:

    这样继续

    select t1.name,t1.lastname from(select * from table)t1.
    

    其中“select * from table”是您的动态查询。这将返回结果,您可以将其用作示例中给出的临时表 t1。

    【讨论】:

      【解决方案3】:

      您可以在当前执行上下文中使用变量,这些变量由带有 OUTPUT 选项的动态 SQL 设置。示例代码如下。

      DECLARE @Amount AS MONEY
      DECLARE   @SQL AS NVARCHAR(1000)
      SET @Amount = NULL 
      SET @SQL = ('SELECT @amt=100' )
      EXECUTE   sp_executeSQL @SQL, N'@amt MONEY OUTPUT', @amt=@Amount OUTPUT
      SELECT  @Amount
      

      【讨论】:

        【解决方案4】:

        是的,您可以使用如下插入创建一个包含原始查询的新动态查询:

        declare @strNewQuery varchar(max)
        set @strNewQuery ='select * into #tmh from ('+@strQuery+') as t'
        exec(@strNewQuery)
        

        【讨论】:

          【解决方案5】:

          我用它来解决 - 没有动态查询

          这使用一个表变量来接收数据到过程

          甚至可以对其应用连接

          select * into #itemPhantom from @tbl_items_upload
          
          select * from #itemPhantom
          
          select #itemPhantom.itemreference from #itemPhantom  left join phantom on phantom.name=#itemPhantom.PhantomName
          

          【讨论】:

            猜你喜欢
            • 2014-10-20
            • 2020-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-12
            • 1970-01-01
            相关资源
            最近更新 更多