Использование пользовательской функции в представлении - PullRequest
1 голос
/ 11 августа 2010

Я написал код для View, который должен вызывать пользовательскую функцию, которая возвращает таблицу для соединения с ней. Проблема здесь заключается в передаче параметра, который нужен этой функции, прямо из моего поля зрения.

Ниже код моего взгляда:

select
    GG.Gid,
    GG.StockType StockType,
    COALESCE(STC.Contract, 0) ContractId,
    COALESCE(C.[$Refex], null) ContractRefex,
    ST.[$Refex] StockTypeRefex
from 
(
    select
        G.Gid,
        coalesce(max(G.GEStockType), max(G.EAStockType)) StockType--,
        --case when coalesce(G.GEStockType, G.EAStockType) is null then null else coalesce(G.GEStartDate, G.EAStartDate) end StartDate
    from
    (
        select
            G.Gid, SI.StockType EAStockType, SI.[Date] EAStartDate, null GEStockType, null GEStartDate
        from Goods G
        inner join SiteIn SI on G.SiteIn=SI.[$Id]

        union

        select G.Gid, null EAStockType, null EAStartDate, GE.StockType, GE.EventOn
        from 
        (
            Select
                GE.Gid,  max(GE.EventOn) GEStartDate
            from GoodsEvent GE
            where GE.IsDeleted=0 and GE.[Type]='ST' and GE.EventOn < GETDATE()
            group by Gid 
        ) G
        inner join GoodsEvent GE on GE.Gid=G.Gid
            and G.GEStartDate=GE.EventOn
            and GE.[Type]='ST'
    ) G
    group by G.Gid
) GG
left outer join StockType ST on ST.[$Id]=GG.StockType
inner join (SELECT * FROM [dbo].StockTypeContractGetClosestStartDate(ST.[$Id]))
 STC on  GG.StockType = STC.[Parent]
 inner join Contract C On STC.Contract = C.[$Id]

А это код моей функции:

CREATE FUNCTION StockTypeContractGetClosestStartDate
(
    @ParentId int
)
RETURNS  @StockTypeContract TABLE 
(
    [StartDate] [DateTime] null,
    [Parent] [int] not null,
    [Contract] [int] null
)
AS
BEGIN

 INSERT @StockTypeContract 
    SELECT TOP 1 STC.StartDate , STC.[$ParentId] , STC.Contract
     from StockTypeContract STC
        where STC.[$ParentId] = @ParentId AND STC.StartDate <= GETDATE() 
        order by STC.StartDate desc

    RETURN
END

Выдает ошибку при попытке передать ST. [$ Id] в мою функцию, ошибка: «Не удалось связать многоэлементный идентификатор ST. $ Id».

Есть ли обходной путь для этого?

Ответы [ 2 ]

4 голосов
/ 11 августа 2010

Вам действительно нужно CROSS или OUTTER APPLY . И от ТАК тоже

....
left outer join StockType ST on ST.[$Id]=GG.StockType
CROSS APPLY
[dbo].StockTypeContractGetClosestStartDate(ST.[$Id])
...

(здесь, кстати, я упростила скобки, вероятно, неправильно)

Ваша проблема - «получить набор результатов из StockTypeContractGetClosestStartDate за ST. [$ Id]

0 голосов
/ 11 августа 2010

Если я прав, вы вставляете только одну запись в таблицу возврата вашей функции, если это так, вы можете перестроить функцию как скалярную функцию, это вернет только одно значение и должно решить проблему, состоящую из нескольких частей.

В данный момент вы пытаетесь присоединиться с возможным «многозначным идентификатором».

см. http://technet.microsoft.com/en-us/library/ms186755.aspx для скалярной функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...