簡體   English   中英

如何使用存儲過程將數據存儲在臨時表上?

[英]How to store data on a temp table using Stored procedure?

我正在嘗試根據以下標量函數編寫存儲過程,以顯示每年和每種產品有多少客戶? 如果產品沒有客戶,則結果應為客戶數量為零,因此應顯示所有產品。 然后我想將其插入到臨時表中。 到目前為止,這是我一直在嘗試的方法,但是對於SP中的某些方面,我不知道要達到我的結果該做什么。 我猜它陷入了一個循環:(任何想法?

標量:

CREATE FUNCTION NumOfCustomers
(
    @year INT,
    @productId INT,
    @typeOfCustomer NVARCHAR
)
RETURNS TABLE AS 
RETURN
(
SELECT COUNT(DISTINCT Sales.Customer.CustomerID) AS number 

FROM    Sales.SalesOrderDetail SOD 
        INNER JOIN Sales.SalesOrderHeader SOH ON SOD.SalesOrderID = SOH.SalesOrderID
        INNER JOIN Sales.Customer ON Customer.CustomerID = SOH.CustomerID

WHERE
    SOD.ProductID = @productID 
    AND YEAR(SOH.OrderDate) = @year
    AND Sales.Customer.CustomerType = @typeOfCustomer
)
GO   

存儲過程:

CREATE PROCEDURE MYsp AS 
BEGIN
    DECLARE @year INT, @count INT
    DECLARE yearCursor CURSOR FOR
    SELECT DISTINCT YEAR(SOH.OrderDate) FROM Sales.SalesOrderHeader SOH
    --ORDER BY YEAR DESC
    OPEN yearCursor
    FETCH NEXT FROM  yearCursor INTO @year
    --** Starting the loop in curser and filling the data
    SET @count = 1
    WHILE(@@FETCH_STATUS = 0)
    BEGIN

            DECLARE @prodID INT
            DECLARE @NumOfCustomers INT
            DECLARE prodCursor CURSOR FOR
            SELECT P.ProductID FROM Production.Product P
            OPEN prodCursor
            FETCH NEXT FROM  prodCursor INTO @prodID
            SET @count = 1
            WHILE(@@FETCH_STATUS = 0)
            BEGIN   
                SELECT @NumOfCustomers = NUM.number FROM NumOfCustomers(@year, @prodID, 's') NUM
                INSERT #temp (Year,ProductID,NumOfCustomers) VALUES (@year,@prodID,@NumOfCustomers)

                SET @count = @count+1
                FETCH NEXT FROM prodCursor INTO @prodID
            END
            CLOSE prodCursor
            DEALLOCATE prodCursor

        FETCH NEXT FROM yearCursor INTO @year
    END
    CLOSE yearCursor
    DEALLOCATE yearCursor
END
GO

然后我想執行它並從該臨時表中獲取數據:

EXEC MYsp
SELECT * FROM #temp

在過程中使用select語句:

   CREATE PROCEDURE MYsp AS 
    BEGIN
        DECLARE @year INT, @count INT
        DECLARE yearCursor CURSOR FOR
        SELECT DISTINCT YEAR(SOH.OrderDate) FROM Sales.SalesOrderHeader SOH
        --ORDER BY YEAR DESC
        OPEN yearCursor
        FETCH NEXT FROM  yearCursor INTO @year
        --** Starting the loop in curser and filling the data
        SET @count = 1
        WHILE(@@FETCH_STATUS = 0)
        BEGIN

                DECLARE @prodID INT
                DECLARE @NumOfCustomers INT
                DECLARE prodCursor CURSOR FOR
                SELECT P.ProductID FROM Production.Product P
                OPEN prodCursor
                FETCH NEXT FROM  prodCursor INTO @prodID
                SET @count = 1
                WHILE(@@FETCH_STATUS = 0)
                BEGIN   
                    SELECT @NumOfCustomers = NUM.number FROM NumOfCustomers(@year, @prodID, 's') NUM
                    INSERT #temp (Year,ProductID,NumOfCustomers) VALUES (@year,@prodID,@NumOfCustomers)

                    SET @count = @count+1
                    FETCH NEXT FROM prodCursor INTO @prodID
                END
                CLOSE prodCursor
                DEALLOCATE prodCursor

            FETCH NEXT FROM yearCursor INTO @year
        END
        CLOSE yearCursor
        DEALLOCATE yearCursor
    Select *
     from #temp
    END

GO

現在執行程序:

EXEC MYsp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM