Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 |
Conteúdo relacionado
Para obter mais dicas de desenvolvimento, consulte Visão geral do desenvolvimento.