воскресенье, 17 марта 2013 г.

Пример использования операции CROSS APPLY для создания кросс-соединения строки и результата выполнения собственной функции

Пример использования операции CROSS APPLY для создания кросс-соединения строки детализации заказа и результата выполнения собственной функции fn_Vector для этой строки

Результат - повторение строки детализации заказа в количестве равном количеству единиц товара


USE AdventureWorks2012
GO

-- Многооператорная табличная функция, возвращающая набор значений от 1 до @N


GO
IF OBJECT_ID (N'Sales.fn_Vector') IS NOT NULL
DROP FUNCTION Sales.fn_Vector
GO

CREATE FUNCTION Sales.fn_Vector
(
    @N INT
)
RETURNS
@Table_Var TABLE
(
    ID INT
)
AS
BEGIN
    DECLARE @Current INT = 1
    WHILE (@Current  <= @N)
    BEGIN
        INSERT @Table_Var VALUES (@Current)
        SET  @Current += 1
    END
    RETURN
END
GO

-- Пример использования функции

SELECT *
FROM Sales.fn_Vector(5)

-- Использование операции CROSS APPLY для создания кросс-соединения строки детализации заказа и результата выполнения Sales.fn_Vector(OrderQty) для этой строки

Результат - повторение строки детализации заказа в количестве равном количеству единиц товара.

-- Номер заказа 43659
SELECT
    OD.ProductID
    ,OD.OrderQty
    ,OD.UnitPrice
    ,V.ID AS Item
    ,'' AS SerialNumber
FROM Sales.SalesOrderDetail AS OD
    CROSS APPLY
    Sales.fn_Vector(OrderQty) AS V
WHERE OD.SalesOrderID = 43659