【问题标题】:return temporary table from SQL stored procedure从 SQL 存储过程返回临时表
【发布时间】:2011-12-06 07:52:44
【问题描述】:

我写了这个存储过程:

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

我想返回临时表#tempreturn #temp 不起作用。我还希望在函数结束时删除临时表。

我该怎么做?

【问题讨论】:

  • 在您发布的代码中,您可以直接使用 select 语句,如果您在此处发布完整的存储过程,则在此存储过程中永远不需要临时表

标签: sql stored-procedures temp-tables


【解决方案1】:

你会添加:

select * from #temp

在程序结束时。

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

【讨论】:

  • 你在写 :-) 我这样做是因为在我正在构建的 ASP.NET 网络中以这种方式将数据获取到 sqlDataSource 时遇到问题。
【解决方案2】:

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

但是,为什么不直接在存储过程中选择并正常使用结果集呢?这里不需要临时表

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

【讨论】:

  • [FAB28].[dbo].[PLC_TAGS2] 是一个视图,由于某种原因,我的 ASP.NET 网站中的 sqlDataSource 从它获取数据时出现问题,我收到此错误: “执行查询时出错。请检查命令的语法,如果存在,请检查参数的类型和值并确保它们正确。无法启用约束。一行或多行包含违反非空唯一值的值,或外键约束”,但如果从普通表中获取数据,则没有问题。所以我试图通过使用临时表来解决这个问题。
  • @user454558:听起来数据违反了客户端代码 DataTable 中定义的一些约束。使用临时表可能无济于事,因为数据在您期望没有 NULL 的地方仍然有 NULL,或者在您期望唯一值时重复等
  • 我尝试将 VIEW 中的所有数据复制到普通表中,并且从表中检索数据没有问题。
  • @user454558:如果这有效,那么您这意味着您没有拨打相同的电话或拥有相同的数据。
【解决方案3】:

关于您问题的第二部分 - 在存储过程中创建的任何临时表都会在存储过程完成后自动删除 - 您无需采取任何其他操作。

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 2010-11-29
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多