创建一个包含返回记录的存储过程

时间:2019-06-05 09:35:51

标签: sql sql-server stored-procedures

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

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

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

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

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

任何对此困境的建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

您可以使用上述临时表,也可以使用表类型(对于这些示例,我使用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

最良好的祝愿
迈克尔