Alguém aqui teve sorte em criar e usar UDFs no banco de dados do data warehouse do Azure ? Estou no meio da migração de um warehouse local do SQL Server 2014 para o datawarehouse do Azure e tive um problema com UDFs.
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
Este UDF funciona perfeitamente no SQL Server 2014. Quando eu o crio no data warehouse do Azure, ele é criado, mas não funciona quando o consulto. Ele retorna um NULL
. Eu verifiquei coisas óbvias como se a tabela de destino existe, etc. Examinei a documentação CREATE FUNCTION para o data warehouse do Azure e há um UDF de exemplo que converte int
em um arquivo decimal
. Isso funciona perfeitamente no Azure DW. No momento em que escrevo uma função simples que possui um select
, ela falha. Infelizmente, a documentação do Azure aqui não é muito útil e gostaria de saber se algum de vocês teve esse problema. Se sim, como resolveu?
Acabei de testar outro caso de uso e também não funciona:
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
As funções no Azure DW não oferecem suporte a instruções select que acessam tabelas como no seu caso de uso, consulte CREATE FUNCTION (SQL Data Warehouse) :
Você poderia verificar se a função foi criada no DW?
O Azure SQL Data Warehouse tem suporte limitado para UDFs. Ainda não suporta a sintaxe
SELECT @var =
. Em vez disso, você deve usarDECLARE @var int =
ouSET @var =
. SQL DW UDFs também ainda não suportam consultas em tabelas de usuário. Por favor, use nossa página de feedback para votar em novos recursos.Existe um utilitário de Migração de Data Warehouse (disponível aqui ) para Azure SQL Data Warehouse que detecta problemas como tipos de dados incompatíveis, funções em linha, uso de dicas, uso de
RETURN
instruçãoINSERT ... EXEC
e muitos outros:Infelizmente, ele não capta funções escalares que fazem referência a tabelas e realmente deveria. No entanto, para sua função específica, pode ser apenas uma exibição (ou até outra tabela), por exemplo
Eu tentei isso no meu Azure SQL Data Warehouse e funcionou perfeitamente bem.
Você também deve saber que as funções escalares no SQL Server não escalam bem quando chamadas em tabelas e, se você tiver o volume apropriado para o SQL Data Warehouse do Azure (ou seja, bilhões de linhas), precisará repensar o uso de funções escalares de qualquer forma. Por exemplo, usar
CTAS
e escrever mais código processual é uma boa abordagem que permitirá que você faça uso adequado dessa plataforma imensamente poderosa.