如何从存储过程返回创建表?

时间:2013-01-29 18:10:47

标签: sql sql-server sql-server-2008

我有一个Microsoft SQL Server R2 2008.我在生命中第一次看到它 我有一个SP:

DECLARE @RC int
DECLARE @Id uniqueidentifier
DECLARE @Segment_ID uniqueidentifier
DECLARE @SDate datetime
DECLARE @EDate datetime
DECLARE @withBig bit
DECLARE @withKm bit
DECLARE @withGeo bit
DECLARE @withDescr bit


DECLARE @BusStationCursor CURSOR
SET @BusStationCursor = CURSOR FOR
SELECT Id, Segment_ID, E_Date_Begin, E_Date_Begin
FROM BusStation

OPEN @BusStationCursor
FETCH NEXT    FROM @BusStationCursor INTO @ID, @Segment_ID, @SDate, @EDate
WHILE @@FETCH_STATUS = 0
BEGIN

EXECUTE @RC = [dd_ugra].[dbo].[Request_BusStation] 
  @Id
  ,@Segment_ID
  ,@SDate
  ,@EDate
  ,@withBig=1
  ,@withKm=1
  ,@withGeo=1
  ,@withDescr=1


FETCH NEXT    FROM @BusStationCursor INTO @ID, @Segment_ID, @SDate, @EDate
END
CLOSE @BusStationCursor
DEALLOCATE @BusStationCursor
GO

但是我有一个静态信息所以我不想每当我想看数据时调用sp,如何使用sp结果创建表?

更新

所以我有一个什么返回一些列。我可以用sp来创建视图。我不能发布sp becouse它真的很大。

1 个答案:

答案 0 :(得分:2)

您可以call a procedure from a view

create view MyView as
    select *
    from openrowset (
        'sqloledb',
        'server=(local);trusted_connection=yes;',
        'exec MyDatabase.dbo.MyStoredProcedure'
    )

请注意,您必须对任何参数进行硬编码,否则返回proc中可能的所有记录(可能必须更改proc)并使用视图定义中的where子句或外部查询进行过滤(views don'拿参数,他们采取where子句。

此外,您可以将视图简单地定义为光标:

SELECT Id, Segment_ID, E_Date_Begin, E_Date_Begin
FROM BusStation

然后再次在外部查询中使用where子句。这会假设proc中的游标和逻辑实际上并没有改变数据,这可能是一个长镜头(为什么还需要一个游标?)。

除此之外,你必须准确理解proc正在做什么来确定你是否可以进行同样的查询(查看)。显然,如果没有proc的完整代码以及proc可能调用的任何其他proc / functions / triggers / views,SE社区就无法协助这项工作。