2013-03-08 64 views
4

我完全不熟悉存儲過程。這一次,我需要在MS SQL中創建一個存儲過程。循環遍歷一個記錄集並使用結果做另一個SQL選擇並返回結果

比方說,我有下表。

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

     34, 4 
     35, 8 
     35, 11 

如何傳入SomeID。使用此SomeID從表ListOfProducts中選擇記錄集。然後遍歷這個記錄集。

比方說,我通過在SomeID = 35

所以,記錄集將返回2條記錄與SomeID 35.在循環中,我會得到的ProductID 8和11,這將被用來做另一種選擇從另一張桌子。

存儲過程應該返回第二個select的結果。

如何在MS SQL存儲過程中執行此操作?

對不起,對於這個新手問題。謝謝你的幫助。

+0

我認爲這是關係到[這個問題](http://stackoverflow.com/questions/15285478/how-to-find-id-not-in-the-master-id-table)。你能否用你期望的結果更新這個問題,因爲我想你可能正在尋找一個'JOIN'。 – JodyT 2013-03-08 03:40:41

+0

是的,它與這個問題有關。我正試圖解決同樣的問題。但是,我正在嘗試一種不同的方式來解決它。現在,我需要的是能夠遍歷存儲過程中的記錄集,並能夠從循環中的內部選擇中返回組合記錄集。 – 2013-03-08 04:02:23

+2

在SQL中使用循環的原因很少。通過加入,你幾乎可以做得更好。 – 2013-03-08 05:16:56

回答

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 
7

如果你想通過記錄循環。你可以這樣做:

--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 [email protected] 

    Delete @temp1 Where [email protected] 
End 

Select * From @FinalTable 
+0

如何在while循環中獲取SomeId和ProductId的值?你能向我展示一個對價值做些什麼的陳述嗎?我不明白要輸入什麼。 「SomeId」神奇地是我可以在Select SomeId ...行後使用的變量嗎? – cja 2016-02-03 16:31:07

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

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 
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 
相關問題