Hat hier jemand Glück gehabt, UDFs in der Azure Data Warehouse- Datenbank zu erstellen und zu verwenden ? Ich bin gerade dabei, ein On-Prem-Warehouse von SQL Server 2014 auf Azure Datawarehouse zu migrieren, und bin auf ein Problem mit UDFs gestoßen.
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
Diese UDF funktioniert perfekt unter SQL Server 2014. Wenn ich sie in Azure Data Warehouse erstelle, wird sie erstellt, funktioniert aber nicht, wenn ich sie abfrage. Es gibt a zurück NULL
. Ich habe offensichtliche Dinge überprüft, wie ob die Zieltabelle existiert usw. Alle überprüfen. Ich habe mir die Dokumentation zu CREATE FUNCTION für Azure Data Warehouse angesehen und sie enthält eine Beispiel-UDF, die int
in eine konvertiert wird decimal
. Dies funktioniert in Azure DW einwandfrei. In dem Moment, in dem ich eine einfache Funktion schreibe, die eine hat select
, schlägt sie fehl. Leider ist die Dokumentation von Azure hier nicht wirklich hilfreich, und ich habe mich gefragt, ob einer von Ihnen auf dieses Problem gestoßen ist. Wenn ja, wie haben Sie das gelöst?
Ich habe gerade einen anderen Anwendungsfall getestet und es funktioniert auch nicht:
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