0

Я пытаюсь написать хранимую процедуру на основе функции Scalar ниже, чтобы показать, что для каждого года и для каждого продукта количество клиентов? и если у продукта нет клиентов , тогда он должен быть в результате с Zero для количества клиентов, поэтому он должен показывать все продукты. а затем я хочу вставить его в временную таблицу. Это то, что я пробовал до сих пор, но в некоторых случаях в 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 

ответ

0

Использовать инструкцию выбора внутри процедуры:

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 
+0

Aziz Он ничего в таблице темп не вставить ...! Ошибка: Процедура MYsp не имеет параметров и аргументов. –

+0

Это работает на моем сервере sql 2012 без ошибок. –

Смежные вопросы