sql 标量函数
Posted
技术标签:
【中文标题】sql 标量函数【英文标题】:sql scalar functions 【发布时间】:2011-06-08 08:38:38 【问题描述】:我的代码中有一个标量函数,它调用另一个标量函数,该函数调用另外两个表,如下所述。我知道这一定表现得像猪一样。它在整个数据库中都使用......我的问题是它的一些外部开发技能将其重写为表值函数。
我试图说服一些开发人员重写函数,但我们只有 JAVA 人员,没有专门的 SQL 开发人员,所以他们看不到任何问题。谁能建议这应该如何重写?非常感谢...
CREATE FUNCTION [dbo].[getInvertCurrencyExchangeRateByDate](@casino_id char(16),@currency_code char(3), @end_date datetime)
RETURNS float AS
BEGIN
declare @retval float;
set @retval =
dbo.getCurrencyExchangeRateByDate(@casino_id,@currency_code,@end_date);
if (@retval != 0) return 1/@retval;
return 0;
END
CREATE FUNCTION [dbo].[getCurrencyExchangeRateByDate](@casino_id char(16),@currency_code char(3), @end_date datetime)
RETURNS float AS
BEGIN
declare @retval float;
declare @casino_curr_code char(3);
set @casino_curr_code =
(SELECT TOP 1 currency_code
FROM Casino
WHERE
casino_id=@casino_id
);
if (@currency_code = @casino_curr_code) return 1;
set @retval =
COALESCE(
(
SELECT TOP 1 exchange_rate
FROM CurrencyExchangeRateHistory
WHERE
casino_id=@casino_id and
currency_code=@currency_code AND
transact_time <= @end_date
ORDER BY
transact_time DESC
),0.0);
return @retval
END
【问题讨论】:
【参考方案1】:我很抱歉,但是对于一些相当简单的事情来说,代码太多了 我认为这样可以满足查询需求。
CREATE FUNCTION dbo.TVF(@casino_id char(16),@currency_code char(3), @end_date datetime)
RETURNS TABLE
AS
RETURN --IF THE JOIN FAILS OR RETURNS 0, DIVISION WILL NEVER HAPPEN AND FALL IN THE ISNULL
SELECT TOP 1 CASE WHEN A.currency_code = @currency_code THEN 1 ELSE ISNULL(1/NULLIF(B.exchange_rate,0), 0) END AS RETVAL
FROM Casino A
LEFT JOIN CurrencyExchangeRateHistory B ON A.casino_id = B.casino_id AND B.transact_time <= @end_date AND B.currency_code = A.currency_code
WHERE A.casino_id = @casino_id
ORDER BY B.transact_time DESC
【讨论】:
以上是关于sql 标量函数的主要内容,如果未能解决你的问题,请参考以下文章