【问题标题】:How to store data on a temp table using Stored procedure?如何使用存储过程将数据存储在临时表上?
【发布时间】:2014-01-07 07:34:24
【问题描述】:

我正在尝试基于下面的标量函数编写存储过程,以显示每年和每种产品有多少客户?如果产品没有客户 那么它应该在结果中为零的客户数量,所以它应该显示所有产品。然后我想将它插入临时表。这是我迄今为止尝试过的,但对于 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

【问题讨论】:

    标签: sql stored-procedures sql-server-2008-r2 user-defined-functions


    【解决方案1】:

    在过程中使用 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
    

    【讨论】:

    • Aziz 它不会在临时表中插入任何内容...!错误是:过程 MYsp 没有提供参数和参数。
    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2016-11-21
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2015-02-15
    • 2011-01-17
    相关资源
    最近更新 更多