代码之家  ›  专栏  ›  技术社区  ›  Gonzalo

如何将存储过程的结果插入到新表中?

  •  2
  • Gonzalo  · 技术社区  · 9 年前

    我有一个返回 SELECT (无法将其转换为视图,因为它比 选择 ). 我想将结果存储到一个新的非临时表中。

    到目前为止,这是我尝试过的

    select * 
    into newTable 
    from (StoredProcedure) t
    

    但它抛出一个错误:

    “)”附近的语法不正确。

    编辑:我的SP是

    CREATE PROCEDURE Soporte.ManejoSPs
    @NombreSP nvarchar (200)
    AS
    
    declare @qry nvarchar (500)
    
    IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES 
                     WHERE TABLE_NAME = @NombreSP + 'Table')
    BEGIN
    
        set @qry = 'select top 0 into ' + @NombreSP  + 'Table from (@NombreSP)     t'
        print @qry
        exec(@qry)
    END
    
    
    declare @Ultima datetime
    declare @Tabla nvarchar(200)
    declare @Minutos int
    
    Select @Minutos = Minutos, @Tabla = NombreTabla, @Ultima = UltimaVez from     Soporte.ManejoSP where NombreSP = @NombreSP
    
    If (datediff(mi, @Ultima, getdate()) > @Minutos)
    BEGIN
    
        set @qry = 'INSERT INTO ' + @Tabla + ' exec ' + @NombreSP
        exec(@qry)
    END
    
    set @qry = 'Select * from ' + @Tabla
    exec(@qry)
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   TT.    9 年前

    笔记 :以下仅在SQL Server 2008 R2之前有效。对于SQL Server 2012+,这将不起作用(需要 WITH RESULT SETS 看见 here 关于其规格的一些细节)。


    如果调用了存储过程 t (在数据库中 db_name 和架构 schema_name )和桌子 newTable 尚不存在:

    SELECT
      *
    INTO
      newTable
    FROM
      OPENROWSET (
        'SQLNCLI',
        'Server=localhost;Trusted_Connection=yes;',
        'SET FMTONLY OFF; EXEC [db_name].[schema_name].t;'
      );
    

    如果服务器是命名实例,则需要提供正确的server参数( ServerName\Instance ).

    为此,您需要先执行以下命令 Ad Hoc Distributed Queries 。您只需要执行一次。

    sp_configure 'Show Advanced Options', 1
    GO
    RECONFIGURE
    GO
    sp_configure 'Ad Hoc Distributed Queries', 1
    GO
    RECONFIGURE
    GO
    

    如果 新建表格 表已存在:

    INSERT INTO newTable
    EXEC t