UDF Таблица UDV или Скалярная UDF? - PullRequest
0 голосов
/ 20 октября 2011

Я сделаю все возможное, чтобы этот вопрос был лучше моего последнего фиаско. Я получаю страшный> "не могу найти ни столбец" dbo ", ни пользовательскую функцию, ни агрегат" dbo.PriMonthAvgPrice ", либо имя неоднозначное.

Я пытаюсь найти среднюю продажную цену за предыдущий месяц. Вот мой UDF:

USE [WoodProduction]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[PriMonthAvgPrice]
(
-- Add the parameters for the function here
@endofmonth     datetime,
@begofmonth     datetime,
@PlantCode      varchar
)
RETURNS decimal (10,2)
AS
BEGIN
-- Declare the return variable here
DECLARE @MonthEndAvgPrice  decimal (10,2)

-- Add the T-SQL statements to compute the return value here
SELECT @MonthEndAvgPrice =

(
    select  

        sum(Actual_Sales_Dollars/Actual_Volume)

        FROM

        woodproduction.dbo.plywood_layup_sales pls
        WHERE

        Production_Date between @begofmonth and @endofmonth
        and actual_volume <> 0
        and @PlantCode = pls.Plant_Code


)

-- Return the result of the function
RETURN @MonthEndAvgPrice

END

Это мой оператор SELECT из моего запроса:

    SELECT
DISTINCT    
    P.[Plant_Number]
    ,p.plant_name   
,pls.plant_code
    ,(pls.[Budget_Realization]) AS 'BR'
    ,(pls.[Actual_Volume] ) AS 'AV'
    ,(pls.[Budget_Volume])  AS 'BV'
--,sum (dpb.[Gross_Production_Per_Hr]) AS 'GPB'
    ,(p.Production_Volume) AS 'PV'
    ,CASE 
        WHEN    coalesce (pls.[Actual_Volume],0) = 0 and
                coalesce (pls.[Actual_Sales_Dollars],0) = 0
                THEN 0
        ELSE (pls.[Actual_Sales_Dollars]/pls.[Actual_Volume])
    END
    AS 'AP'
    ,pls.production_date
  ,[dbo].[PriMonthAvgPrice](@endofmonth,@begofmonth, pls.plant_code) AS 'PriMoAvgPrice'

Мое базовое понимание - я создал скалярную функцию. Из того, что я читал о своей ошибке, эта ошибка возвращается на TVF. Это правда? До этого я создавал SVF, имея дело только с определением даты окончания предыдущего месяца, поэтому он не был таким же сложным, как этот, где я создаю запрос в UDF.

Мне нужно изменить это на TVF? И если да, то как мне включить SELECT *, когда мне нужно объединить несколько таблиц вместе с этим?

Заранее спасибо.

Aaron

1 Ответ

1 голос
/ 20 октября 2011

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

Это работает, если вы полностью укажете имя (включая базу данных)?

Вы независимо тестировали функцию с:

select [dbo].[PriMonthAvgPrice] ('01/01/2011', '02/01/2011', 'test')

Примечание: конечно, вы бы использовали некоторые фактические значения, которые должны возвращать результат.

Пожалуйста, запустите это и сообщите нам возвращаемые значения:

 SELECT Actual_Sales_Dollars,Actual_Volume, pls.PLant_code          
 FROM   woodproduction.dbo.plywood_layup_sales pls         
 WHERE  Production_Date between '09-01-2011'  and  '09-30-2011'          
        and actual_volume <> 0      
...