我写了这个存储过程:
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
不起作用。另外,我希望在函数结束时删除临时表。
我该怎么做?
答案 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)
对于问题的次要部分 - 存储过程中创建的任何临时表都会在存储过程完成时自动删除 - 您不必采取任何其他操作。