как исправить Не удается найти ни столбец dbo, ни определяемую пользователем функцию, ни агрегат, либо имя неоднозначно

Мне нужно вызвать функцию на сервере SQL, но я получил ошибку!

 cannot find either column "dbo" or the user-defined function or
    aggregate "dbo.udf_Sum_ExtraHours", or the name is ambiguous.

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

функция, которую я сохранил:

ALTER FUNCTION dbo.udf_Sum_ExtraHours
    (
    @strt date,
    @end date

    )
RETURNS  TABLE 
AS
    RETURN

    WITH cte
AS (
    SELECT ExtraHrs 
        ,CASE 
            WHEN left(ExtraHrs, 1) = '-'
                THEN - 1
            ELSE 1
            END AS multiply
        ,right(ExtraHrs, 8) AS timestring
        ,
        --get hours in seconds:
        DATEPART(HOUR, right(ExtraHrs, 8)) * 3600 AS h_in_s
        ,
        --get minutes in seconds:
        DATEPART(MINUTE, right(ExtraHrs, 8)) * 60 AS m_in_s
        ,
        --get seconds:
        DATEPART(SECOND, right(ExtraHrs, 8)) AS s
    FROM  vw_Rept_Attend  where convert(date,AtnDate) between @strt and @end 
    )
    ,CTE3
AS (
    SELECT *
        ,c.h_in_s + c.m_in_s + c.s AddExtra
    FROM cte c
    )
    ,cte4
AS (
    SELECT sum(AddExtra * multiply) mn
    FROM cte3
    )
    ,cte5
AS (
    SELECT mn / 3600 hh
        ,(mn % 3600) / 60 mi
        ,(mn % 3600.0) % 60 ss
    FROM cte4
    )
SELECT 
    cast(hh AS VARCHAR) + ':' + cast(mi AS VARCHAR) + ':' + cast(ss AS VARCHAR) as ExtraHrs
FROM cte5

теперь хранимая процедура, из которой я хочу вызвать эту функцию,

     select   UserID,
dbo.udfTimeSpanFromSeconds(Sum(Left(workhrs,2) * 3600 + substring(Convert(varchar(8),workhrs), 4,2) * 60 + substring(Convert(varchar(8),workhrs), 7,2))) as WorkHrs ,

dbo.udf_Sum_ExtraHours('2015-10-12','2015-10-14'),// function which throw error

EmpName,EmpType,UserName, Role,convert(VARCHAR(10),
StartDate,105) as StartDate,convert(VARCHAR(10),EndDate,105) as EndDate
from    vw_Rept_Attend  where  convert(date,AtnDate) between '2015-10-12' and '2015-10-14' 
group by UserID,

EmpName,EmpType,UserName, Role,StartDate,EndDate
      Order by UserID

но в студии управления сервером SQL функция дает мне точный вывод, когда я выполняю отдельную функцию без использования хранимой процедуры

вывод в студию управления SQL выглядит так:

введите здесь описание изображения

Я читаю

Не удается найти ни один из столбцов dbo, либо определяемая пользователем функция, либо агрегат dbo.Splitfn, либо имя неоднозначно

и Не удается найти столбец «dbo», либо определяемая пользователем функция, либо агрегат «dbo.FN_Split», либо имя неоднозначно

и многое другое, но не могу решить мою проблему,

пожалуйста, помогите мне выбраться из этого,

спасибо


person Waqas    schedule 12.10.2015    source источник


Ответы (1)


Ваша функция возвращает таблицу и поэтому не может использоваться в списке столбцов предложения select.

Я вижу три подхода (возможно, их больше;)):

  1. присоединиться к результату функций:

    select [...], extraTime, [...]
    from    vw_Rept_Attend 
    cross apply dbo.udf_Sum_ExtraHours('2015-10-12','2015-10-14') as ex(extraTime)
    [...]
    
  2. создайте подзапрос в списке столбцов:

    select [...], 
    (    
        select top 1 ExtraHrs from dbo.udf_Sum_ExtraHours('2015-10-12','2015-10-14')
    ) ExtraHrs, [...]
    from    vw_Rept_Attend 
    [...]
    
  3. переопределить функцию, чтобы она возвращала одно значение:

    ALTER FUNCTION dbo.udf_Sum_ExtraHours
    (
    @strt date,
    @end date
    
    )
    RETURNS INT -- or VARCHAR or some other single value type
    /* method body returning single value */
    
person flo    schedule 12.10.2015
comment
не могли бы вы предоставить мне пример, спасибо за ваше драгоценное время - person Waqas; 12.10.2015
comment
Отличное объяснение! Ужасная ошибка от MS SQL. - person Chuck Kasabula; 16.04.2021
comment
Я бы не назвал это ошибкой. Существует фундаментальное различие между обычными udf и utf с табличным значением. Как и в других языках программирования, где нельзя просто комбинировать массивы со строковыми значениями. - person flo; 17.04.2021