вернуть временную таблицу из хранимой процедуры SQL - PullRequest
1 голос
/ 06 декабря 2011

Я написал эту хранимую процедуру:

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 ]

2 голосов
/ 06 декабря 2011

Вы бы добавили:

select * from #temp

в конце процедуры.

В вашем SP временная таблица выглядит избыточной.Вы можете просто заменить оператор insert на select, чтобы немедленно вернуть данные.

1 голос
/ 06 декабря 2011

Вы не возвращаете подобные временные таблицы из хранимых процедур. Сначала нужно создать временную таблицу, вызвать 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
0 голосов
/ 06 декабря 2011

К второстепенной части вашего вопроса - любые временные таблицы, созданные в хранимой процедуре, автоматически удаляются по завершении хранимой процедуры - вам не нужно предпринимать никаких дополнительных действий.

...