Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kumpulan Synapse SQL yang disediakan dan tanpa server memungkinkan Anda menempatkan logika pemrosesan data yang kompleks ke dalam prosedur tersimpan SQL. Prosedur tersimpan adalah cara yang bagus untuk merangkum kode SQL Anda dan menyimpannya dekat dengan data Anda di gudang data. Prosedur tersimpan membantu pengembang memodulasi solusi mereka dengan merangkum kode ke dalam unit yang dapat dikelola, dan memfasilitasi penggunaan kembali kode yang lebih besar. Setiap prosedur tersimpan juga dapat menerima parameter untuk membuatnya lebih fleksibel. Dalam artikel ini Anda akan menemukan beberapa tips untuk menerapkan prosedur tersimpan di kumpulan Synapse SQL untuk mengembangkan solusi.
Apa yang diharapkan
Synapse SQL mendukung banyak fitur T-SQL yang digunakan di SQL Server. Lebih penting lagi, ada fitur spesifik peluasan skala yang dapat Anda gunakan untuk memaksimalkan performa solusi Anda. Dalam artikel ini, Anda akan mempelajari tentang fitur yang dapat Anda tempatkan di dalam prosedur yang disimpan.
Nota
Dalam isi prosedur, Anda hanya dapat menggunakan fitur yang didukung di area permukaan Synapse SQL. Tinjau artikel ini untuk mengidentifikasi objek dan pernyataan yang dapat digunakan dalam prosedur tersimpan. Contoh dalam artikel ini menggunakan fitur-fitur generik yang tersedia baik di lingkungan tanpa server maupun khusus. Lihat batasan lain dalam kumpulan Synapse SQL yang tersedia dan tanpa server di akhir artikel ini.
Untuk mempertahankan skala dan performa kumpulan SQL, ada juga beberapa fitur dan fungsionalitas yang memiliki perbedaan perilaku dan lainnya yang tidak didukung.
Prosedur tersimpan di Synapse SQL
Dalam contoh berikut, Anda bisa melihat prosedur yang menghilangkan objek eksternal jika ada di database:
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
Prosedur ini dapat dijalankan menggunakan EXEC pernyataan di mana Anda dapat menentukan nama prosedur dan parameter:
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 menyediakan implementasi prosedur tersimpan yang disederhanakan dan efisien. Perbedaan terbesar dibandingkan dengan SQL Server adalah bahwa prosedur tersimpan bukan kode yang telah dikompilasi sebelumnya. Di gudang data, waktu kompilasi kecil dibandingkan dengan waktu yang diperlukan untuk menjalankan kueri terhadap volume data besar. Lebih penting untuk memastikan kode prosedur tersimpan dioptimalkan dengan benar untuk kueri besar. Tujuannya adalah untuk menghemat jam, menit, dan detik, bukan milidetik. Oleh karena itu lebih membantu untuk memikirkan prosedur tersimpan sebagai kontainer untuk logika SQL.
Ketika Synapse SQL menjalankan prosedur tersimpan Anda, pernyataan SQL diurai, diterjemahkan, dan dioptimalkan pada waktu proses. Selama proses ini, setiap pernyataan dikonversi menjadi kueri terdistribusi. Kode SQL yang dijalankan terhadap data berbeda dari kueri yang dikirimkan.
Merangkum aturan validasi
Prosedur tersimpan memungkinkan Anda menemukan logika validasi dalam satu modul yang disimpan dalam database SQL. Dalam contoh berikut, Anda dapat melihat cara memvalidasi nilai parameter dan mengubah nilai defaultnya.
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 dalam prosedur sql akan memvalidasi parameter input ketika prosedur dipanggil.
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.
Penyusunan prosedur tersimpan bersarang
Ketika prosedur tersimpan memanggil prosedur tersimpan lainnya, atau menjalankan SQL dinamis, prosedur tersimpan dalam atau pemanggilan kode dikatakan berlapis. Contoh prosedur berlapis diperlihatkan dalam kode berikut:
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
Prosedur ini menerima parameter yang mewakili beberapa nama lalu memanggil prosedur lain untuk menghilangkan objek dengan nama ini. Kumpulan Synapse SQL mendukung maksimum delapan tingkat bersarang. Kemampuan ini sedikit berbeda dari SQL Server. Tingkat sarang di SQL Server adalah 32.
Panggilan prosedur tersimpan tingkat atas sama dengan tingkat sarang 1.
EXEC clean_up 'mytest'
Jika prosedur tersimpan juga melakukan panggilan EXEC lain, tingkat sarang meningkat menjadi dua.
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
Jika prosedur kedua kemudian menjalankan beberapa SQL dinamis, tingkat sarang meningkat menjadi tiga.
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
Nota
Synapse SQL saat ini tidak mendukung @@NESTLEVEL. Anda perlu melacak tingkat sarang. Anda tidak mungkin melebihi batas delapan tingkat sarang, tetapi jika Anda melakukannya, Anda perlu mengerjakan ulang kode Anda agar sesuai dengan tingkat berlapis dalam batas ini.
MASUKKAN.. EKSEKUSI
Kumpulan Synapse SQL yang disediakan tidak mengizinkan Anda untuk menggunakan kumpulan hasil prosedur tersimpan dengan pernyataan INSERT. Ada pendekatan alternatif yang dapat Anda gunakan. Misalnya, lihat artikel tentang tabel sementara untuk kumpulan Synapse SQL yang disediakan.
Keterbatasan
Ada beberapa aspek prosedur tersimpan Transact-SQL yang tidak diterapkan di Synapse SQL, seperti:
| Fitur/opsi | Disediakan | Tanpa server |
|---|---|---|
| Prosedur tersimpan sementara | Tidak | Ya |
| Prosedur tersimpan bernomor | Tidak | Tidak |
| Prosedur tersimpan yang diperluas | Tidak | Tidak |
| Prosedur tersimpan CLR | Tidak | Tidak |
| Opsi enkripsi | Tidak | Ya |
| Opsi replikasi | Tidak | Tidak |
| Parameter bertipe tabel | Tidak | Tidak |
| Parameter baca-saja | Tidak | Tidak |
| Parameter standar | Tidak | Ya |
| Konteks eksekusi | Tidak | Tidak |
| Pernyataan pengembalian | Tidak | Ya |
| SISIPKAN KE DALAM .. EXEC | Tidak | Ya |
Konten terkait
Untuk tips pengembangan selengkapnya, lihat ringkasan pengembangan.