Azure 数据仓库 - 用户定义的函数问题

RK *_*ala 7 sql-server etl functions azure-sql-data-warehouse

这里有没有人在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
Run Code Online (Sandbox Code Playgroud)

此 UDF 在 SQL Server 2014 上完美运行。当我在 Azure 数据仓库上创建此 UDF 时,它已创建但在我查询时不起作用。它返回一个NULL. 我已经验证了明显的事情,比如目标表是否存在等。所有检查。我查看了 Azure 数据仓库的CREATE FUNCTION文档,它有一个示例 UDF 可以转换intdecimal. 这在 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
Run Code Online (Sandbox Code Playgroud)

小智 6

Azure DW 中的函数不支持像在您的用例中那样访问表的选择语句,请参阅CREATE FUNCTION(SQL 数据仓库)

function_body
指定一系列不引用数据库数据(表或视图)的 Transact-SQL 语句定义函数的值。

你能仔细检查一下这个函数是在 DW 中创建的吗?


小智 6

Azure SQL 数据仓库对 UDF 的支持有限。它尚不支持语法SELECT @var =。相反,您必须使用DECLARE @var int =SET @var =。SQL DW UDF 也不支持对用户表的查询。请使用我们的反馈页面为新功能投票。

  • “我们的”反馈页面!你在微软工作吗?如果您在此处或在您的个人资料中声明您的隶属关系,那就太好了。 (8认同)