AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 139213
Accepted
RK Kuppala
RK Kuppala
Asked: 2016-05-23 10:02:05 +0800 CST2016-05-23 10:02:05 +0800 CST 2016-05-23 10:02:05 +0800 CST

Data warehouse do Azure - problemas de funções definidas pelo usuário

  • 772

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 intem 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
sql-server functions
  • 3 3 respostas
  • 5846 Views

3 respostas

  • Voted
  1. Best Answer
    Jovan MSFT
    2016-05-23T14:54:33+08:002016-05-23T14:54:33+08:00

    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) :

    function_body
    Especifica que uma série de instruções Transact-SQL, que não fazem referência a dados do banco de dados (tabelas ou exibições), definem o valor da função.

    Você poderia verificar se a função foi criada no DW?

    • 6
  2. Sonya Marshall
    2016-05-23T17:45:08+08:002016-05-23T17:45:08+08:00

    O Azure SQL Data Warehouse tem suporte limitado para UDFs. Ainda não suporta a sintaxeSELECT @var = . Em vez disso, você deve usar DECLARE @var int =ou SET @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.

    • 6
  3. wBob
    2016-05-26T05:37:53+08:002016-05-26T05:37:53+08:00

    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 RETURNinstrução INSERT ... EXECe muitos outros:

    Exemplo de relatório de compatibilidade de banco de dados

    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

    CREATE VIEW dbo.vw_ImpliedRates
    AS
    SELECT 1 term, [1] impliedRate, Multiple
    FROM  dbo.ImpliedRate 
    UNION ALL
    SELECT 2 term, [2], Multiple
    FROM  dbo.ImpliedRate 
    UNION ALL
    SELECT 3 term, [3], Multiple
    FROM  dbo.ImpliedRate 
    UNION ALL
    SELECT 4 term, [4], Multiple
    FROM  dbo.ImpliedRate;
    GO
    
    CREATE TABLE dbo.test
    (
        Multiple    FLOAT NOT NULL,
        Term        INT NOT NULL
    );
    GO
    
    INSERT INTO dbo.test ( Multiple, Term )
    VALUES
        ( 0.001, 1 ), ( 0.001, 2 ), ( 0.001, 3 ), ( 0.001, 4 );
    GO
    
    
    SELECT impliedRate, v.Multiple
    FROM dbo.test t
        INNER JOIN dbo.vw_ImpliedRates v
            ON t.Multiple = v.Multiple
           AND t.Term = v.Term;
    
    SELECT *
    FROM dbo.vw_ImpliedRates
    WHERE Multiple = 0.001
      AND Term = 2
    

    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 CTASe escrever mais código processual é uma boa abordagem que permitirá que você faça uso adequado dessa plataforma imensamente poderosa.

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve