Udostępnij za pośrednictwem


Procedury składowane korzystające z usługi Synapse SQL w usłudze Azure Synapse Analytics

Pule aprowizowane i bezserwerowe usługi Synapse SQL umożliwiają umieszczenie złożonej logiki przetwarzania danych w procedurach składowanych SQL. Procedury składowane to doskonały sposób na hermetyzowanie kodu SQL i przechowywanie go blisko danych w magazynie danych. Procedury składowane pomagają deweloperom modularyzować swoje rozwiązania, hermetyzując kod w możliwe do zarządzania jednostki i ułatwiając ponowne zastosowanie kodu. Każda procedura składowana może również akceptować parametry, aby uczynić je jeszcze bardziej elastycznymi. W tym artykule znajdziesz kilka wskazówek dotyczących implementowania procedur składowanych w puli Synapse SQL na potrzeby opracowywania rozwiązań.

Czego oczekiwać

Usługa Synapse SQL obsługuje wiele funkcji języka T-SQL, które są używane w SQL Server. Co ważniejsze, istnieją funkcje specyficzne dla skalowania w poziomie, których można użyć, aby zmaksymalizować wydajność rozwiązania. W tym artykule poznasz funkcje, które można umieścić w procedurach składowanych.

Uwaga

W treści procedury można używać tylko tych funkcji, które są obsługiwane w obszarze powierzchni synapse SQL. Zapoznaj się z tym artykułem , aby zidentyfikować obiekty, instrukcję, która może być używana w procedurach składowanych. W przykładach w tych artykułach są używane funkcje ogólne, które są dostępne zarówno w obszarze powierzchni bezserwerowej, jak i dedykowanej. Zobacz dodatkowe ograniczenia dotyczące aprowizowania i bezserwerowych pul SQL usługi Synapse na końcu tego artykułu.

Aby zachować skalę i wydajność puli SQL, istnieją również pewne funkcje, które mają różnice behawioralne i inne, które nie są obsługiwane.

Procedury składowane w usłudze Synapse SQL

W poniższym przykładzie przedstawiono procedury, które porzucają obiekty zewnętrzne, jeśli istnieją w bazie danych:

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

Te procedury można wykonać przy użyciu EXEC instrukcji , w której można określić nazwę i parametry procedury:

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

Usługa Synapse SQL zapewnia uproszczoną i usprawnianą implementację procedur składowanych. Największą różnicą w porównaniu z SQL Server jest to, że procedura składowana nie jest wstępnie skompilowanym kodem. W magazynach danych czas kompilacji jest niewielki w porównaniu z czasem potrzebnym na uruchamianie zapytań względem dużych woluminów danych. Ważniejsze jest upewnienie się, że kod procedury składowanej jest poprawnie zoptymalizowany pod kątem dużych zapytań. Celem jest zapisanie godzin, minut i sekund, a nie milisekund. W związku z tym bardziej pomocne jest myślenie o procedurach składowanych jako kontenerach dla logiki SQL.

Gdy usługa Synapse SQL wykonuje procedurę składowaną, instrukcje SQL są analizowane, tłumaczone i optymalizowane w czasie wykonywania. Podczas tego procesu każda instrukcja jest konwertowana na zapytania rozproszone. Kod SQL wykonywany względem danych różni się od przesłanego zapytania.

Hermetyzowanie reguł weryfikacji

Procedury składowane umożliwiają lokalizowanie logiki walidacji w jednym module przechowywanym w bazie danych SQL. W poniższym przykładzie można zobaczyć, jak zweryfikować wartości parametrów i zmienić ich wartości domyślne.

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

Logika w procedurze SQL zweryfikuje parametry wejściowe po wywołaniu procedury.


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.

Zagnieżdżanie procedur składowanych

Gdy procedury składowane wywołają inne procedury składowane lub wykonują dynamiczną metodę SQL, mówi się, że wewnętrzna procedura składowana lub wywołanie kodu są zagnieżdżone. Przykład procedury zagnieżdżonej przedstawiono w następującym kodzie:

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

Ta procedura akceptuje parametr reprezentujący nazwę, a następnie wywołuje inne procedury, aby usunąć obiekty o tej nazwie. Pula SQL usługi Synapse obsługuje maksymalnie osiem poziomów zagnieżdżania. Ta funkcja jest nieco inna niż SQL Server. Poziom zagnieżdżenia w SQL Server wynosi 32.

Wywołanie procedury składowanej najwyższego poziomu odpowiada poziomowi zagnieżdżenia 1.

EXEC clean_up 'mytest'

Jeśli procedura składowana wykonuje również inne wywołanie EXEC, poziom zagnieżdżenia zwiększa się do dwóch.

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

Jeśli druga procedura wykonuje dynamiczny kod SQL, poziom zagnieżdżenia wzrasta do trzech.

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

Uwaga

Usługa Synapse SQL nie obsługuje obecnie @@NESTLEVEL. Musisz śledzić poziom zagnieżdżania. Jest mało prawdopodobne, aby przekroczyć limit poziomu ośmiu zagnieżdżeń, ale jeśli to zrobisz, musisz przerobić kod, aby dopasować poziomy zagnieżdżenia w ramach tego limitu.

WSTAWIĆ.. WYKONAĆ

Aprowizowana pula SQL usługi Synapse nie zezwala na korzystanie z zestawu wyników procedury składowanej za pomocą instrukcji INSERT. Istnieje alternatywne podejście, którego można użyć. Aby zapoznać się z przykładem, zobacz artykuł dotyczący tabel tymczasowych dla aprowizowanej puli SQL usługi Synapse.

Ograniczenia

Istnieją pewne aspekty procedur składowanych języka Transact-SQL, które nie są implementowane w usłudze Synapse SQL, takie jak:

Funkcja/opcja Zaaprowizowane Praca bezserwerowa
Tymczasowe procedury składowane Nie Tak
Ponumerowane procedury składowane Nie Nie
Rozszerzone procedury składowane Nie Nie
Procedury składowane CLR Nie Nie
Opcja szyfrowania Nie Tak
Opcja replikacji Nie Nie
Parametry z wartościami przechowywanymi w tabeli Nie Nie
Parametry tylko do odczytu Nie Nie
Parametry domyślne Nie Tak
Konteksty wykonywania Nie Nie
Return, instrukcja Nie Tak
WSTAW DO PLIKU .. EXEC Nie Tak

Następne kroki

Aby uzyskać więcej porad dotyczących programowania, zobacz Omówienie programowania.