5

我对存储过程完全陌生。这一次,我需要在 MS SQL 中创建一个存储过程。

假设我有下表。

     Table name: ListOfProducts  
      --------------------------
       SomeID, ProductID  

         34, 4
         35, 8
         35, 11

我如何传递 SomeID。使用此 SomeID 从表 ListOfProducts 中选择记录集。然后循环遍历这个记录集。

假设我传入 SomeID = 35。

因此,记录集将返回 2 条 SomeID 为 35 的记录。在循环中,我将获得 ProductID 8 和 11,这将用于从另一个表中进行另一个选择。

存储过程应返回第二次选择的结果。

如何在 MS SQL 存储过程中执行此操作?

对不起,这个新手问题。谢谢你的帮助。

4

5 回答 5

8

如果你想遍历记录。你可以这样做:

--Container to Insert Id which are to be iterated
Declare @temp1 Table
(
  tempId int
)
--Container to Insert records in the inner select for final output
Declare @FinalTable  Table
(
  Id int,
  ProductId int
)

Insert into @temp1 
Select Distinct SomeId From YourTable

-- Keep track of @temp1 record processing
Declare @Id int
While((Select Count(*) From @temp1)>0)
Begin
   Set @Id=(Select Top 1 tempId From @temp1)

   Insert Into @FinalTable 
   Select SomeId,ProductId From ListOfProducts Where Id=@Id

   Delete @temp1 Where tempId=@Id
End

Select * From @FinalTable
于 2013-03-08T06:45:50.757 回答
2

如果您不需要对无法在整个集合上完成的产品执行某些操作,那么编写显式循环可能没有意义。SQL Server 可以自己更好地处理这样的事情。我不知道你的桌子是什么样子的,但你应该尝试一些看起来更像这样的东西。

CREATE PROC dbo.yourProcName 
   @SomeID int
AS 
BEGIN
    SELECT
        P.ProductId,
        P.ProductName
    FROM
        Product P
        JOIN 
            ListOfProducts LOP
            ON LOP.ProductId = P.ProductId
    WHERE
        LOP.SomeId = @SomeID 
END
于 2013-03-08T11:43:46.310 回答
1

为了从选择的结果集开始/结束时间中提取小时数,然后创建一个每小时迭代的新表,我必须做类似的事情。

DECLARE @tCalendar TABLE
(
    RequestedFor VARCHAR(50),
    MeetingType VARCHAR(50),
    RoomName VARCHAR(MAX),
    StartTime DATETIME,
    EndTime DATETIME
)

INSERT INTO @tCalendar(RequestedFor,MeetingType,RoomName,StartTime,EndTime)
SELECT req as requestedfor
      ,meet as meetingtype
      ,room as rooms
      ,start as starttime
      ,end as endtime

      --,u.datetime2 as endtime
    FROM mytable



        DECLARE @tCalendarHours TABLE
    (
        RequestedFor VARCHAR(50),
        MeetingType VARCHAR(50),
        RoomName VARCHAR(50),
        Hour INT
        )

    DECLARE @StartHour INT,@EndHour INT, @StartTime DATETIME, @EndTime DATETIME
    WHILE ((SELECT COUNT(*) FROM @tCalendar) > 0)   
    BEGIN
        SET @StartTime = (SELECT TOP 1 StartTime FROM @tCalendar)
        SET @EndTime = (SELECT TOP 1 EndTime FROM @tCalendar)
        SET @StartHour = (SELECT TOP 1 DATEPART(HOUR,DATEADD(HOUR,0,StartTime)) FROM @tCalendar)
        SET @EndHour = (SELECT TOP 1 DATEPART(HOUR,DATEADD(HOUR,0,EndTime)) FROM @tCalendar)
        WHILE @StartHour <= @EndHour
        BEGIN
            INSERT INTO @tCalendarHours
            SELECT RequestedFor,MeetingType,RoomName,@StartHour FROM @tCalendar WHERE StartTime = @StartTime AND EndTime = @EndTime
            SET @StartHour = @StartHour + 1
        END
        DELETE @tCalendar WHERE StartTime = @StartTime AND EndTime = @EndTime
    END
于 2014-09-28T16:57:27.780 回答
0

做这样的事情:

Declare @ID int

SET @ID = 35

SELECT
   p.SomeID
  ,p.ProductID
 FROM ListOfProducts p
  WHERE p.SomeID = @ID
 -----------------------
   --Or if you have to join to get it
  Declare @ID int

  SET @ID = 35

    SELECT
      c.SomeID
      ,p.ProductID
      ,p.ProductName

    FROM ListOfProducts p
    INNER JOIN categories c on p.ProductID = c.SomeID
    WHERE p.SomeID = @ID
于 2013-03-08T04:45:49.527 回答
0

您可以将选项与WHILE循环和BREAK/CONTINUE关键字一起使用

CREATE PROC dbo.yourProcName
@SomeID int
AS
BEGIN
  IF OBJECT_ID('tempdb.dbo.#resultTable') IS NOT NULL DROP TABLE dbo.#resultTable
  CREATE TABLE dbo.#resultTable
   (Col1 int, Col2 int)  
  DECLARE @ProductID int = 0
  WHILE(1=1)
    BEGIN
      SELECT @ProductID = MIN(ProductID) 
      FROM ListOfProducts 
      WHERE SomeID = @SomeID AND ProductID > @ProductID

      IF @ProductID IS NULL
      BREAK
      ELSE

      INSERT dbo.#resultTable
      SELECT Col1, Col2
      FROM dbo.yourSearchTable
      WHERE ProductID = @ProductID

      CONTINUE      
    END
  SELECT *
  FROM dbo.#resultTable 
END    

SQLFiddle上的演示

于 2013-03-08T07:30:05.900 回答