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
quelle
Für Azure SQL Data Warehouse gibt es ein Data Warehouse-Migrationsdienstprogramm ( hier verfügbar ), das Probleme wie inkompatible Datentypen, Inline-Funktionen, Verwendung von Hinweisen, Verwendung von
RETURN
AnweisungenINSERT ... EXEC
und viele andere aufgreift:Leider nimmt es keine skalaren Funktionen auf, die auf Tabellen verweisen, und das sollte es auch. Für Ihre spezielle Funktion kann es sich jedoch nur um eine Ansicht (oder sogar eine andere Tabelle) handeln, z
Ich habe dies in meinem Azure SQL Data Warehouse versucht und es hat einwandfrei funktioniert.
Sie sollten auch wissen, dass Skalarfunktionen in SQL Server nicht gut skaliert werden können, wenn sie für Tabellen aufgerufen werden. Wenn Sie über das für Azure SQL Data Warehouse geeignete Volume (dh Milliarden von Zeilen) verfügen, müssen Sie die Verwendung von Skalarfunktionen überdenken wie auch immer. Das Verwenden
CTAS
und Schreiben von mehr prozeduralem Code ist beispielsweise ein guter Ansatz, mit dem Sie diese immens leistungsstarke Plattform ordnungsgemäß nutzen können.quelle