从SQL存储过程返回临时表

时间:2011-12-06 07:52:44

标签: sql stored-procedures temp-tables

我写了这个存储过程:

USE [FAB28]
GO
/****** Object:  StoredProcedure [dbo].[spPLCIOFilter2]    Script Date: 12/06/2011 08:00:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[spPLCIOFilter2]
(
    @filter1 VARCHAR(50) = '%',
    @filter2 VARCHAR(50) = '%',
    @slot VARCHAR(50) = '%' 
)
AS
BEGIN

    CREATE TABLE #temp
    ( 
         "PLC RIO" char(20)
         ,SIGNAL varchar(6)
         ,RACK char(2)
         ,SLOT char(2)
         ,POINT char(2)
         ,"CARD" char(20)
         ,TAG char(30)
         ,PROJ char(10)
         ,"DESCRIPTION" char(100)
         ,"ADDRESS" varchar(22)
     )

    INSERT INTO #temp
    SELECT
       [PLC] "PLC RIO"
      ,[SIGNAL] SIGNAL
      ,[RACK] RACK
      ,[SLOT] SLOT
      ,[POINT] POINT
      ,[CARD] "CARD"
      ,[TAG] TAG
      ,[PROJ] PROJ
      ,[DESCRIPTION] "DESCRIPTION"
      ,[ADDRESS] "ADDRESS"
    FROM [FAB28].[dbo].[PLC_TAGS2]
    WHERE [PLC] <> ''
    and [PLC] LIKE '%' + @filter1 + '%'
    and [PLC] LIKE '%' + @filter2 + '%'
    and [SLOT] LIKE '%' + @slot + '%'
    ORDER BY [PLC],[RACK],[SLOT],[POINT]

END

我想返回临时表#temp,而return #temp不起作用。另外,我希望在函数结束时删除临时表。

我该怎么做?

3 个答案:

答案 0 :(得分:2)

你会添加:

select * from #temp

在程序结束时。

在您的SP中,临时表看起来多余。您只需将insert语句替换为select即可立即返回数据。

答案 1 :(得分:1)

您不会从存储过程返回这样的临时表。您必须先创建临时表,调用proc,然后读取临时表:所有在同一连接上,以便它保持在范围内

但是,为什么不在存储过程中只选择SELECT并正常使用结果集?你不需要临时表

ALTER Procedure [dbo].[spPLCIOFilter2]
(
    @filter1 VARCHAR(50) = '%',
    @filter2 VARCHAR(50) = '%',
    @slot VARCHAR(50) = '%' 
)
AS
BEGIN
    SELECT
       [PLC] "PLC RIO"
      ,[SIGNAL] SIGNAL
      ,[RACK] RACK
      ,[SLOT] SLOT
      ,[POINT] POINT
      ,[CARD] "CARD"
      ,[TAG] TAG
      ,[PROJ] PROJ
      ,[DESCRIPTION] "DESCRIPTION"
      ,[ADDRESS] "ADDRESS"
    FROM [FAB28].[dbo].[PLC_TAGS2]
    WHERE [PLC] <> ''
    and [PLC] LIKE '%' + @filter1 + '%'
    and [PLC] LIKE '%' + @filter2 + '%'
    and [SLOT] LIKE '%' + @slot + '%'
    ORDER BY [PLC],[RACK],[SLOT],[POINT]
END

答案 2 :(得分:0)

对于问题的次要部分 - 存储过程中创建的任何临时表都会在存储过程完成时自动删除 - 您不必采取任何其他操作。