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

时间:2016-01-07 18:54:23

标签: sql sql-server-2005

我有一个存储过程返回SELECT(无法将其转换为视图,因为它比select * into newTable from (StoredProcedure) t 稍微多一点)。我想将结果存储到一个新的非临时表中。

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

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)

但它引发了一个错误:

  

')附近的语法错误。

编辑:我的SP是

{{1}}

1 个答案:

答案 0 :(得分:2)

注意:以下内容仅适用于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;'
  );

如果服务器是命名实例,则需要提供正确的服务器参数(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

如果newTable表已存在:

INSERT INTO newTable
EXEC t