Uložené procedury využívající Synapse SQL v Azure Synapse Analytics
Zřízené fondy Synapse SQL a bezserverové fondy umožňují umístit do uložených procedur SQL složitou logiku zpracování dat. Uložené procedury představují skvělý způsob zapouzdření kódu SQL a jeho uložení v blízkosti dat v datovém skladu. Uložené procedury pomáhají vývojářům modularizovat jejich řešení tím, že kód zapouzdřují do spravovatelných jednotek a usnadňují větší opakované použití kódu. Každá uložená procedura může také přijímat parametry, aby byly ještě flexibilnější. V tomto článku najdete několik tipů pro implementaci uložených procedur ve fondu Synapse SQL pro vývoj řešení.
Co očekávat
Synapse SQL podporuje mnoho funkcí T-SQL, které se používají v SQL Server. Ještě důležitější je, že existují funkce specifické pro horizontální navýšení kapacity, které můžete použít k maximalizaci výkonu vašeho řešení. V tomto článku se dozvíte o funkcích, které můžete umístit do uložených procedur.
Poznámka
V těle procedury můžete použít pouze funkce, které jsou podporovány v oblasti plochy Synapse SQL. Projděte si tento článek a identifikujte objekty, příkaz, který lze použít v uložených procedurách. Příklady v těchto článcích používají obecné funkce, které jsou k dispozici v bezserverové i vyhrazené oblasti surface. Další omezení ve zřízených a bezserverových fondech Synapse SQL najdete na konci tohoto článku.
Kvůli zachování škálování a výkonu fondu SQL existují také některé funkce, které mají rozdíly v chování, a jiné, které nejsou podporované.
Uložené procedury v Synapse SQL
V následujícím příkladu můžete vidět postupy, které odstraňují externí objekty, pokud existují v databázi:
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
Tyto postupy lze provést pomocí EXEC
příkazu, kde můžete zadat název a 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';
Synapse SQL poskytuje zjednodušenou a zjednodušenou implementaci uložených procedur. Největší rozdíl oproti SQL Server spočívá v tom, že uložená procedura není předkompilovaný kód. V datových skladech je doba kompilace malá v porovnání s dobou potřebnou ke spouštění dotazů na velké objemy dat. Důležitější je zajistit, aby byl kód uložené procedury správně optimalizovaný pro velké dotazy. Cílem je ušetřit hodiny, minuty a sekundy, ne milisekundy. Proto je užitečnější uvažovat o uložených procedurách jako o kontejnerech pro logiku SQL.
Když Synapse SQL spustí uloženou proceduru, příkazy SQL se analyzují, překládají a optimalizují za běhu. Během tohoto procesu se každý příkaz převede na distribuované dotazy. Kód SQL, který je spuštěn proti datům, se liší od odeslaného dotazu.
Zapouzdření ověřovacích pravidel
Uložené procedury umožňují najít logiku ověřování v jednom modulu uloženém v databázi SQL. V následujícím příkladu se můžete podívat, jak ověřit hodnoty parametrů a změnit jejich výchozí hodnoty.
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 v proceduře SQL ověří vstupní parametry při volání 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.
Vnoření uložených procedur
Když uložené procedury volají jiné uložené procedury nebo spouštějí dynamické SQL, znamená to, že vnitřní uložená procedura nebo vyvolání kódu je vnořené. Příklad vnořené procedury je znázorněn v následujícím kódu:
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
Tato procedura přijímá parametr, který představuje nějaký název, a pak volá další procedury, aby se objekty s tímto názvem vyřadily. Fond Synapse SQL podporuje maximálně osm úrovní vnoření. Tato funkce se mírně liší od SQL Server. Úroveň vnoření v SQL Server je 32.
Volání uložené procedury nejvyšší úrovně odpovídá vnoření úrovně 1.
EXEC clean_up 'mytest'
Pokud uložená procedura také provede další volání EXEC, úroveň vnoření se zvýší na dvě.
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
Pokud druhá procedura pak spustí nějaký dynamický SQL, úroveň vnoření se zvýší na tři.
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
Poznámka
Synapse SQL v současné době nepodporuje @@NESTLEVEL. Musíte sledovat úroveň hnízda. Je nepravděpodobné, že byste překročili limit úrovně osm vnoření, ale pokud ano, budete muset přepracovat kód tak, aby odpovídal úrovním vnořování v rámci tohoto limitu.
VLOŽIT.. PROVÉST
Zřízený fond Synapse SQL neumožňuje využívat sadu výsledků uložené procedury pomocí příkazu INSERT. Existuje alternativní přístup, který můžete použít. Příklad najdete v článku o dočasných tabulkách pro zřízený fond Synapse SQL.
Omezení
Existují některé aspekty uložených procedur Jazyka Transact-SQL, které nejsou implementované v Synapse SQL, například:
Funkce/možnost | Zřízené | Bez serveru |
---|---|---|
Dočasné uložené procedury | No | Yes |
Číslování uložených procedur | No | No |
Rozšířené uložené procedury | No | No |
Uložené procedury CLR | No | No |
Možnost šifrování | No | Yes |
Možnost replikace | No | No |
Parametry vracející tabulku | No | No |
Parametry jen pro čtení | No | No |
Výchozí parametry | No | Yes |
Kontexty spuštění | No | No |
Return – příkaz | No | Yes |
VLOŽIT DO .. EXEC | No | Ano |
Další kroky
Další tipy pro vývoj najdete v přehledu vývoje.