sql-server - SQL 标量函数

标签 sql-server user-defined-functions

我的代码中有一个标量函数调用另一个标量函数,该标量函数调用下面详述的 2 个其他表。我知道这一定是表现得像头 pig 。它在整个数据库中使用......我的问题是它有点外部开发技能将其重写为表值函数。

我试图争取一些开发人员重写函数,但我们只有 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

最佳答案

对不起,但是为了一些相当简单的事情,代码太多了 我认为这满足了查询需求。

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-server - SQL 标量函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276213/

相关文章:

mysql - sql View 是正确的解决方案吗

sql-server - 确定性标量函数获取日期的一年中的第几周

mongodb - Mongo 用户定义函数和 Map Reduce

excel - 如何让 VBA 函数存储单元格地址值而不是这些单元格地址处的值

java - 在 Java 中调用 SQL Server 用户定义函数 (UDF)

asp.net - 像Google一样的SQL搜索语句?

sql - 加入日期范围查询

sql - 将分隔字符串传递给存储过程以搜索数据库

c# - 从数据库获取值后,C# 中的查询返回 false

c++ - 函数的声明与实现