【问题标题】:Create a stored procedure which includes return records创建一个包含返回记录的存储过程
【发布时间】:2019-06-05 09:35:51
【问题描述】:

我正在尝试创建一个具有 3 个参数的存储过程。另一个软件会用参数调用我的过程来查询一堆记录。

存储过程仅包含一个select 语句,其中where 子句根据参数进行过滤。

如何将这些记录返回给“调用者”?
我尝试将这些记录插入到临时表中,如下所示:

create procedure xxx
drop table table_temp
select * into table_temp from table where parameters

问题是,如果两个用户同时调用存储过程,他们会得到混淆的结果。

非常感谢您对这一困境的任何建议。

【问题讨论】:

  • 临时表的名称must start with #,但不清楚why您首先需要一个临时表而不是select
  • 正如@GSerg 所说,您的表不是临时表,它是您的 SP 所在的数据库中的物理表。因此同时运行多个 SP 实例 将导致不良行为。一个真正的临时表(以单个 # 为前缀)仅保留在创建它的连接中,并且(同样重要的是)可以被创建它的连接引用。但是,我也看不到这里临时表的原因。无需删除和创建表(通过使用INTO 运算符),只需使用SELECT
  • select * from table where parameters?
  • 这取决于您如何从客户端代码调用该过程。记录已发送,但显然您忽略了它们。
  • 似乎您应该询问的是您的应用程序,而不是 SQL(尽管 SQL 确实需要寻址)。

标签: sql sql-server stored-procedures


【解决方案1】:

您可以使用上述临时表,也可以使用表类型(我使用 AdventureWorks2014 演示数据库作为这些示例):

CREATE PROCEDURE TableVariableDemo(
   @Color nvarchar(15),
   @Size nvarchar(5))
AS
BEGIN
   DECLARE @Results TABLE(ProductID int, [Name] nvarchar(255), ProductNumber nvarchar(25), Color nvarchar(15), Size nvarchar(5))

   INSERT INTO @Results (ProductID, [Name], ProductNumber, Color, Size)
   SELECT
      ProductID,
      [Name],
      ProductNumber,
      Color,
      Size
   FROM
      Production.Product
   WHERE
      Color = @Color AND
      Size = @Size

   SELECT
      ProductID,
      [Name],
      ProductNumber,
      Color,
      Size
   FROM
      @Results
END

当您期望返回的行数不会太多时,该解决方案很好。当您期望查询返回大量行时,使用临时表可能会更好。使用临时表也一样:

 CREATE PROCEDURE TempTableDemo(
    @Color nvarchar(15),
    @Size nvarchar(5))
 AS
 BEGIN
   CREATE TABLE #Results(ProductID int, [Name] nvarchar(255), ProductNumber nvarchar(25), Color nvarchar(15), Size nvarchar(5))

   INSERT INTO #Results (ProductID, [Name], ProductNumber, Color, Size)
   SELECT
      ProductID,
      [Name],
      ProductNumber,
      Color,
      Size
   FROM
      Production.Product
   WHERE
      Color = @Color AND
      Size = @Size

   SELECT
      ProductID,
      [Name],
      ProductNumber,
      Color,
      Size
   FROM
      #Results

   DROP TABLE #Results
END

但我想知道你为什么不使用这样的东西:

 CREATE PROCEDURE SelectDemo(
    @Color nvarchar(15),
    @Size nvarchar(5))
 AS
 BEGIN
   SELECT
      ProductID,
      [Name],
      ProductNumber,
      Color,
      Size
   FROM
      Production.Product
   WHERE
      Color = @Color AND
      Size = @Size
END

最好的祝愿
迈克尔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2014-01-04
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多