Partilhar via


Procedimentos armazenados usando o Synapse SQL no Azure Synapse Analytics

Synapse SQL aprovisionado e pools sem servidor permitem-lhe colocar lógica complexa de processamento de dados em procedimentos armazenados SQL. Os procedimentos armazenados são uma ótima maneira de encapsular seu código SQL e armazená-lo perto de seus dados no data warehouse. Os procedimentos armazenados ajudam os desenvolvedores a modularizar suas soluções, encapsulando o código em unidades gerenciáveis e facilitando uma maior reutilização do código. Cada procedimento armazenado também pode aceitar parâmetros para torná-los ainda mais flexíveis. Neste artigo, você encontrará algumas dicas para implementar procedimentos armazenados no pool SQL Synapse para desenvolver soluções.

O que esperar

Synapse SQL suporta muitos dos recursos T-SQL que são usados no SQL Server. Mais importante ainda, há recursos específicos de expansão que você pode usar para maximizar o desempenho de sua solução. Neste artigo, você aprenderá sobre os recursos que você pode colocar em procedimentos armazenados.

Observação

No corpo do procedimento, você pode usar apenas os recursos suportados na área de superfície do Synapse SQL. Revise este artigo para identificar objetos, instrução que pode ser usada em procedimentos armazenados. Os exemplos nestes artigos usam recursos genéricos que estão disponíveis em área de superfície dedicada e sem servidor. Consulte outras limitações em pools Synapse SQL provisionados e sem servidor no final deste artigo.

Para manter a escala e o desempenho do pool SQL, também há alguns recursos e funcionalidades que têm diferenças comportamentais e outros que não são suportados.

Procedimentos armazenados no Synapse SQL

No exemplo a seguir, você pode ver os procedimentos que descartam objetos externos se eles existirem no banco de dados:

CREATE PROCEDURE drop_external_table_if_exists @name SYSNAME
AS BEGIN
    IF (0 <> (SELECT COUNT(*) FROM sys.external_tables WHERE name = @name))
    BEGIN
        DECLARE @drop_stmt NVARCHAR(200) = N'DROP EXTERNAL TABLE ' + @name; 
        EXEC sp_executesql @tsql = @drop_stmt;
    END
END
GO
CREATE PROCEDURE drop_external_file_format_if_exists @name SYSNAME
AS BEGIN
    IF (0 <> (SELECT COUNT(*) FROM sys.external_file_formats WHERE name = @name))
    BEGIN
        DECLARE @drop_stmt NVARCHAR(200) = N'DROP EXTERNAL FILE FORMAT ' + @name; 
        EXEC sp_executesql @tsql = @drop_stmt;
    END
END
GO
CREATE PROCEDURE drop_external_data_source_if_exists @name SYSNAME
AS BEGIN
    IF (0 <> (SELECT COUNT(*) FROM sys.external_data_sources WHERE name = @name))
    BEGIN
        DECLARE @drop_stmt NVARCHAR(200) = N'DROP EXTERNAL DATA SOURCE ' + @name; 
        EXEC sp_executesql @tsql = @drop_stmt;
    END
END

Esses procedimentos podem ser executados usando EXEC a instrução onde você pode especificar o nome do procedimento e os parâmetros:

EXEC drop_external_table_if_exists 'mytest';
EXEC drop_external_file_format_if_exists 'mytest';
EXEC drop_external_data_source_if_exists 'mytest';

Synapse SQL fornece uma implementação simplificada de procedimento armazenado. A maior diferença em comparação com o SQL Server é que o procedimento armazenado não é código pré-compilado. Em armazéns de dados, o tempo de compilação é pequeno em comparação com o tempo necessário para executar consultas em grandes volumes de dados. É mais importante garantir que o código do procedimento armazenado seja corretamente otimizado para consultas grandes. O objetivo é economizar horas, minutos e segundos, não milissegundos. Portanto, é mais útil pensar em procedimentos armazenados como contêineres para lógica SQL.

Quando o Synapse SQL executa seu procedimento armazenado, as instruções SQL são analisadas, traduzidas e otimizadas em tempo de execução. Durante esse processo, cada instrução é convertida em consultas distribuídas. O código SQL que é executado em relação aos dados é diferente da consulta enviada.

Encapsular regras de validação

Os procedimentos armazenados permitem localizar a lógica de validação em um único módulo armazenado no banco de dados SQL. No exemplo a seguir, você pode ver como validar os valores dos parâmetros e alterar seus valores padrão.

CREATE PROCEDURE count_objects_by_date_created 
                            @start_date DATETIME2,
                            @end_date DATETIME2
AS BEGIN 

    IF( @start_date >= GETUTCDATE() )
    BEGIN
        THROW 51000, 'Invalid argument @start_date. Value should be in past.', 1;  
    END

    IF( @end_date IS NULL )
    BEGIN
        SET @end_date = GETUTCDATE();
    END

    IF( @start_date >= @end_date )
    BEGIN
        THROW 51000, 'Invalid argument @end_date. Value should be greater than @start_date.', 2;  
    END

    SELECT
         year = YEAR(create_date),
         month = MONTH(create_date),
         objects_created = COUNT(*)
    FROM
        sys.objects
    WHERE
        create_date BETWEEN @start_date AND @end_date
    GROUP BY
        YEAR(create_date), MONTH(create_date);
END

A lógica no procedimento sql validará os parâmetros de entrada quando o procedimento for chamado.


EXEC count_objects_by_date_created '2020-08-01', '2020-09-01'

EXEC count_objects_by_date_created '2020-08-01', NULL

EXEC count_objects_by_date_created '2020-09-01', '2020-08-01'
-- Error
-- Invalid argument @end_date. Value should be greater than @start_date.

EXEC count_objects_by_date_created '2120-09-01', NULL
-- Error
-- Invalid argument @start_date. Value should be in past.

Aninhamento de Procedimentos Armazenados

Quando os procedimentos armazenados chamam outros procedimentos armazenados ou executam SQL dinâmico, o procedimento armazenado interno ou a invocação de código é considerada aninhada. Um exemplo de procedimento aninhado é mostrado no código a seguir:

CREATE PROCEDURE clean_up @name SYSNAME
AS BEGIN
    EXEC drop_external_table_if_exists @name;
    EXEC drop_external_file_format_if_exists @name;
    EXEC drop_external_data_source_if_exists @name;
END

Este procedimento aceita um parâmetro que representa algum nome e, em seguida, chama outros procedimentos para descartar os objetos com esse nome. O pool Synapse SQL oferece suporte a um máximo de oito níveis de aninhamento. Esse recurso é ligeiramente diferente do SQL Server. O nível máximo de aninhamento no SQL Server é 32.

A chamada de um procedimento de armazenamento de nível superior corresponde ao nível de aninhamento 1.

EXEC clean_up 'mytest'

Se o procedimento armazenado também fizer outra invocação EXEC, o nível de aninhamento é incrementado para dois.

CREATE PROCEDURE clean_up @name SYSNAME
AS
    EXEC drop_external_table_if_exists @name  -- This call is nest level 2
GO
EXEC clean_up 'mytest'  -- This call is nest level 1

Se o segundo procedimento executar algum SQL dinâmico, o nível de aninhamento aumentará para três.

CREATE PROCEDURE drop_external_table_if_exists @name SYSNAME
AS BEGIN
    /* See full code in the previous example */
    EXEC sp_executesql @tsql = @drop_stmt;  -- This call is nest level 3
END
GO
CREATE PROCEDURE clean_up @name SYSNAME
AS
    EXEC drop_external_table_if_exists @name  -- This call is nest level 2
GO
EXEC clean_up 'mytest'  -- This call is nest level 1

Observação

Synapse SQL atualmente não suporta @@NESTLEVEL. Você precisa acompanhar o nível do ninho. É improvável que você exceda o limite de oito níveis de aninhamento, mas se você fizer isso, precisará retrabalhar seu código para ajustar os níveis de aninhamento dentro desse limite.

INSERIR.. EXECUTAR

O pool SQL Synapse provisionado não permite que você consuma o conjunto de resultados de um procedimento armazenado com uma instrução INSERT. Há uma abordagem alternativa que você pode usar. Para obter um exemplo, consulte o artigo sobre tabelas temporárias para o pool SQL Synapse provisionado.

Limitações

Existem alguns aspetos dos procedimentos armazenados Transact-SQL que não são implementados no Synapse SQL, tais como:

Característica/opção Aprovisionado Sem servidor
Procedimentos armazenados temporários Não Yes
Procedimentos armazenados numerados Não Não
Procedimentos armazenados ampliados Não Não
Procedimentos armazenados CLR Não Não
Opção de encriptação Não Yes
Opção de replicação Não Não
Parâmetros com valor de tabela Não Não
Parâmetros somente leitura Não Não
Parâmetros padrão Não Yes
Contextos de execução Não Não
Declaração de devolução Não Yes
INSERIR EM .. EXEC Não Yes

Para obter mais dicas de desenvolvimento, consulte Visão geral do desenvolvimento.