这里的任何人都幸运地在Azure 数据仓库数据库上创建和使用 UDF ?我正在将本地仓库从 SQL Server 2014 迁移到 Azure 数据仓库,但遇到了 UDF 问题。
CREATE FUNCTION dbo.fn_GetImpliedRate (@Multiple float, @term int)
RETURNS float
AS
BEGIN
DECLARE @ImpInt float
IF(@Term = 1)
SET @ImpInt = (select [1] from dbo.ImpliedRate where Multiple = @Multiple);
IF(@Term = 2)
SET @ImpInt = (select [2] from dbo.ImpliedRate where Multiple = @Multiple);
IF(@Term = 3)
SET @ImpInt = (select [3] from dbo.ImpliedRate where Multiple = @Multiple);
IF(@Term = 4)
SET @ImpInt = (select [4] from dbo.ImpliedRate where Multiple = @Multiple);
RETURN @ImpInt
END;
GO
此 UDF 在 SQL Server 2014 上完美运行。当我在 Azure 数据仓库上创建它时,它会被创建,但当我查询它时它不起作用。它返回一个NULL
. 我已经验证了目标表是否存在等明显的事情。全部检查。我查看了 Azure 数据仓库的CREATE FUNCTION文档,它有一个示例 UDF,可以转换int
为decimal
. 这在 Azure DW 上完美运行。当我编写一个具有 的简单函数时select
,它失败了。不幸的是,这里的 Azure 文档并没有真正的帮助,我想知道你们中是否有人遇到过这个问题。如果是,您是如何解决的?
我刚刚测试了另一个用例,它也不起作用:
CREATE function [dbo].[fn_GetNumberBusinessDays]
(
@StartDate datetime,
@EndDate Datetime
)
returns int
as
begin
DECLARE @NDAYS INT = 0
SELECT @NDAYS =
ISNULL( (DATEDIFF(dd, @StartDate, @EndDate) + 1)
-(DATEDIFF(wk, @StartDate, @EndDate) * 2)
-(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) - 1 ,0) + 1
SELECT @NDAYS = @NDAYS - COUNT(*)
FROM dbo.FedHolidays
WHERE DateOfHoliday BETWEEN @StartDate AND @EndDate
RETURN @NDAYS
end
GO
Azure DW 中的函数不支持在您的用例中访问表的选择语句,请参阅CREATE FUNCTION (SQL Data Warehouse):
你能仔细检查一下这个函数是在 DW 中创建的吗?
Azure SQL 数据仓库对 UDF 的支持有限。它还不支持语法
SELECT @var =
。相反,您必须使用DECLARE @var int =
orSET @var =
。SQL DW UDF 还不支持对用户表的查询。请使用我们的反馈页面为新功能投票。Azure SQL 数据仓库有一个数据仓库迁移实用程序(可在此处获得),它可以解决诸如不兼容的数据类型、内联函数、提示的使用、
RETURN
语句的使用INSERT ... EXEC
等问题:不幸的是,它没有选择引用表的标量函数,它确实应该。但是,对于您的特定功能,它可能只是一个视图(甚至是另一个表),例如
我在我的 Azure SQL 数据仓库上进行了尝试,效果非常好。
您还应该知道,SQL Server 中的标量函数在针对表调用时不能很好地扩展,如果您有适合 Azure SQL 数据仓库的卷(即数十亿行),那么您将需要重新考虑使用标量函数反正。例如,使用
CTAS
和编写更多的程序代码是一种很好的方法,可以让您正确使用这个非常强大的平台。