【发布时间】:2011-12-12 00:09:26
【问题描述】:
我会尽我最大的努力使这个问题比我上次的惨败更好。我得到了可怕的>“找不到列“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 *?
提前致谢。
亚伦
【问题讨论】:
-
那里也有
FROM子句吗? -
我有点怀疑,因为我在您的函数中看到了一个带有数据库名称 (
woodproduction.dbo.plywood_layup_sales) 的表引用。您是否在创建函数的同一数据库中运行此查询? -
pls.[Actual_Sales_Dollars]/pls.[Actual_Volume]) = 如果两列都是整数,请注意此处的整数数学。另外,我通常会在任何除法中进行除以零检查,这样如果底部数字为 0 或 null,它就不会停止。你知道你的数据,也许它不是必需的,但这是一个好习惯。很多次我都有一个意想不到的零。
-
SELECT * 不应在生产代码中使用,尤其是在存在连接时。它效率低下,并导致数据库通过 newtork 发送的信息比需要的多(连接字段重复)。
-
@HLGEM 我想了很多,整个查询中有很多连接。我为这个报告中的另一个数据集做了一个基本的 UDF,但它不涉及使用这样的查询。这只是一个 DATE UDF。
标签: sql ssrs-2008 user-defined-functions