EXECUTE (Transact-SQL)
Berlaku untuk: Titik akhir analitik SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Platform System (PDW)
SQL di Microsoft Fabric
Warehouse di Microsoft Fabric
Menjalankan string perintah atau string karakter dalam batch Transact-SQL, atau salah satu modul berikut: prosedur tersimpan sistem, prosedur tersimpan yang ditentukan pengguna, prosedur tersimpan CLR, fungsi yang ditentukan pengguna bernilai skalar, atau prosedur tersimpan yang diperluas. Pernyataan EXECUTE dapat digunakan untuk mengirim perintah pass-through ke server tertaut. Selain itu, konteks di mana string atau perintah dijalankan dapat diatur secara eksplisit. Metadata untuk kumpulan hasil dapat ditentukan dengan menggunakan opsi WITH RESULT SETS.
Penting
Sebelum Anda memanggil EXECUTE dengan string karakter, validasi string karakter. Jangan pernah menjalankan perintah yang dibangun dari input pengguna yang belum divalidasi.
Sintaks
Blok kode berikut menunjukkan sintaks di SQL Server 2019 dan versi yang lebih baru. Atau, lihat sintaks di SQL Server 2017 dan yang lebih lama sebagai gantinya.
-- Syntax for SQL Server 2019 and later versions
Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
[;]
Execute a character string
{ EXEC | EXECUTE }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { LOGIN | USER } = ' name ' ]
[;]
Execute a pass-through command against a linked server
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ]
[ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]
)
[ AS { LOGIN | USER } = ' name ' ]
[ AT linked_server_name ]
[ AT DATA_SOURCE data_source_name ]
[;]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
<result_sets_definition> ::=
{
(
{ column_name
data_type
[ COLLATE collation_name ]
[ NULL | NOT NULL ] }
[,...n ]
)
| AS OBJECT
[ db_name . [ schema_name ] . | schema_name . ]
{table_name | view_name | table_valued_function_name }
| AS TYPE [ schema_name.]table_type_name
| AS FOR XML
}
Blok kode berikut menunjukkan sintaks di SQL Server 2017 dan yang lebih lama. Atau, lihat sintaks di SQL Server 2019 sebagai gantinya.
-- Syntax for SQL Server 2017 and earlier
Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
[;]
Execute a character string
{ EXEC | EXECUTE }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { LOGIN | USER } = ' name ' ]
[;]
Execute a pass-through command against a linked server
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ]
[ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]
)
[ AS { LOGIN | USER } = ' name ' ]
[ AT linked_server_name ]
[;]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
<result_sets_definition> ::=
{
(
{ column_name
data_type
[ COLLATE collation_name ]
[ NULL | NOT NULL ] }
[,...n ]
)
| AS OBJECT
[ db_name . [ schema_name ] . | schema_name . ]
{table_name | view_name | table_valued_function_name }
| AS TYPE [ schema_name.]table_type_name
| AS FOR XML
}
-- In-Memory OLTP
Execute a natively compiled, scalar user-defined function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name | @module_name_var }
[ [ @parameter = ] { value
| @variable
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
<execute_option>::=
{
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
-- Syntax for Azure SQL Database
Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH RECOMPILE ]
}
[;]
Execute a character string
{ EXEC | EXECUTE }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { USER } = ' name ' ]
[;]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
<result_sets_definition> ::=
{
(
{ column_name
data_type
[ COLLATE collation_name ]
[ NULL | NOT NULL ] }
[,...n ]
)
| AS OBJECT
[ db_name . [ schema_name ] . | schema_name . ]
{table_name | view_name | table_valued_function_name }
| AS TYPE [ schema_name.]table_type_name
| AS FOR XML
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse
-- Execute a stored procedure
[ { EXEC | EXECUTE } ]
procedure_name
[ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ] }
[;]
-- Execute a SQL string
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )
[;]
-- Syntax for Microsoft Fabric
-- Execute a stored procedure
[ { EXEC | EXECUTE } ]
procedure_name
[ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ]
[ WITH <execute_option> [ ,...n ] ] }
[;]
-- Execute a SQL string
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )
[;]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
Catatan
Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.
Argumen
@return_status
Adalah variabel bilangan bulat opsional yang menyimpan status pengembalian modul. Variabel ini harus dideklarasikan dalam batch, prosedur tersimpan, atau fungsi sebelum digunakan dalam pernyataan EXECUTE.
Ketika digunakan untuk memanggil fungsi yang ditentukan pengguna bernilai skalar, variabel @return_status dapat berupa jenis data skalar apa pun.
module_name
Adalah nama yang sepenuhnya memenuhi syarat atau tidak memenuhi syarat dari prosedur tersimpan atau fungsi yang ditentukan pengguna bernilai skalar untuk dipanggil. Nama modul harus mematuhi aturan untuk pengidentifikasi. Nama prosedur tersimpan yang diperluas selalu peka huruf besar/kecil, terlepas dari kolase server.
Modul yang telah dibuat di database lain dapat dijalankan jika pengguna yang menjalankan modul memiliki modul atau memiliki izin yang sesuai untuk menjalankannya dalam database tersebut. Modul dapat dijalankan di server lain yang menjalankan SQL Server jika pengguna yang menjalankan modul memiliki izin yang sesuai untuk menggunakan server tersebut (akses jarak jauh) dan untuk menjalankan modul dalam database tersebut. Jika nama server ditentukan tetapi tidak ada nama database yang ditentukan, Mesin Database SQL Server mencari modul dalam database default pengguna.
;angka
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru
Adalah bilangan bulat opsional yang digunakan untuk mengelompokkan prosedur dengan nama yang sama. Parameter ini tidak digunakan untuk prosedur tersimpan yang diperluas.
Catatan
Fitur ini akan dihapus dalam versi SQL Server yang akan datang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini.
Untuk informasi selengkapnya tentang grup prosedur, lihat CREATE PROCEDURE (Transact-SQL).
@module_name_var
Adalah nama variabel yang ditentukan secara lokal yang mewakili nama modul.
Ini bisa menjadi variabel yang menyimpan nama fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar.
@parameter
Adalah parameter untuk module_name, seperti yang didefinisikan dalam modul. Nama parameter harus didahului dengan tanda (@). Ketika digunakan dengan formulir nilai @parameter_name=, nama parameter dan konstanta tidak harus disediakan dalam urutan di mana mereka didefinisikan dalam modul. Namun, jika formulir nilai @parameter_name=digunakan untuk parameter apa pun, formulir tersebut harus digunakan untuk semua parameter berikutnya.
Secara default, parameter dapat diubah ke null.
value
Adalah nilai parameter untuk diteruskan ke modul atau perintah pass-through. Jika nama parameter tidak ditentukan, nilai parameter harus disediakan dalam urutan yang ditentukan dalam modul.
Saat menjalankan perintah pass-through terhadap server tertaut, urutan nilai parameter tergantung pada penyedia OLE DB server yang ditautkan. Sebagian besar penyedia OLE DB mengikat nilai ke parameter dari kiri ke kanan.
Jika nilai parameter adalah nama objek, string karakter, atau memenuhi syarat dengan nama database atau nama skema, seluruh nama harus diapit dalam tanda kutip tunggal. Jika nilai parameter adalah kata kunci, kata kunci harus diapit dalam tanda kutip ganda.
Jika Anda meneruskan satu kata yang tidak dimulai dengan @
dan itu tidak diapit dalam tanda kutip - misalnya, jika Anda lupa @
pada nama parameter - kata diperlakukan sebagai string nvarchar, terlepas dari tanda kutip yang hilang.
Jika default ditentukan dalam modul, pengguna dapat menjalankan modul tanpa menentukan parameter.
Defaultnya juga bisa NULL. Umumnya, definisi modul menentukan tindakan yang harus diambil jika nilai parameter adalah NULL.
@variabel
Adalah variabel yang menyimpan parameter atau parameter pengembalian.
OUTPUT
Menentukan bahwa modul atau string perintah mengembalikan parameter. Parameter yang cocok dalam modul atau string perintah juga harus dibuat dengan menggunakan OUTPUT kata kunci. Gunakan kata kunci ini saat Anda menggunakan variabel kursor sebagai parameter.
Jika nilai didefinisikan sebagai OUTPUT modul yang dijalankan terhadap server tertaut, setiap perubahan pada @parameter terkait yang dilakukan oleh penyedia OLE DB akan disalin kembali ke variabel di akhir eksekusi modul.
Jika parameter OUTPUT sedang digunakan dan niatnya adalah menggunakan nilai pengembalian dalam pernyataan lain dalam batch atau modul panggilan, nilai parameter harus diteruskan sebagai variabel, seperti @parameter = @variabel. Anda tidak dapat menjalankan modul dengan menentukan OUTPUT untuk parameter yang tidak didefinisikan sebagai parameter OUTPUT dalam modul. Konstanta tidak dapat diteruskan ke modul dengan menggunakan OUTPUT; parameter pengembalian memerlukan nama variabel. Jenis data variabel harus dideklarasikan dan nilai yang ditetapkan sebelum menjalankan prosedur.
Ketika EXECUTE digunakan terhadap prosedur tersimpan jarak jauh, atau untuk menjalankan perintah pass-through terhadap server tertaut, parameter OUTPUT tidak boleh menjadi salah satu jenis data objek besar (LOB).
Parameter pengembalian dapat dari jenis data apa pun kecuali jenis data LOB.
DEFAULT
Menyediakan nilai default parameter seperti yang didefinisikan dalam modul. Ketika modul mengharapkan nilai untuk parameter yang tidak memiliki default yang ditentukan dan parameter hilang atau kata kunci DEFAULT ditentukan, kesalahan terjadi.
@string_variable
Adalah nama variabel lokal. @ string_variable dapat berupa jenis data karakter, varchar, nchar, atau nvarchar apa pun. Ini termasuk jenis data (maks).
[N] 'tsql_string'
Adalah string konstanta. tsql_string dapat berupa jenis data nvarchar atau varchar apa pun. Jika N disertakan, string ditafsirkan sebagai jenis data nvarchar .
CONTEXT_SPECIFICATION AS <>
Menentukan konteks di mana pernyataan dijalankan.
LOGIN
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru
Menentukan konteks yang akan ditiru adalah login. Cakupan peniruan adalah server.
USER
Menentukan konteks yang akan ditiru adalah pengguna dalam database saat ini. Cakupan peniruan dibatasi untuk database saat ini. Peralihan konteks ke pengguna database tidak mewarisi izin tingkat server pengguna tersebut.
Penting
Meskipun peralihan konteks ke pengguna database aktif, setiap upaya untuk mengakses sumber daya di luar database akan menyebabkan pernyataan gagal. Ini termasuk pernyataan database USE, kueri terdistribusi, dan kueri yang mereferensikan database lain dengan menggunakan pengidentifikasi tiga atau empat bagian.
'nama'
Adalah nama pengguna atau login yang valid. nama harus merupakan anggota peran server tetap sysadmin atau ada sebagai prinsipal dalam sys.database_principals atau sys.server_principals.
nama tidak dapat berupa akun bawaan, seperti NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, atau NT AUTHORITY\LocalSystem.
Untuk informasi selengkapnya, lihat Menentukan Nama Pengguna atau Login nanti dalam topik ini.
[N] 'command_string'
Adalah string konstanta yang berisi perintah yang akan diteruskan ke server tertaut. Jika N disertakan, string ditafsirkan sebagai jenis data nvarchar .
[?]
Menunjukkan parameter yang nilainya disediakan dalam <daftar> arg perintah pass-through yang digunakan dalam pernyataan EXEC('...', <arg-list>) AT <linkedsrv> .
AT linked_server_name
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru
Menentukan bahwa command_string dijalankan terhadap linked_server_name dan hasil, jika ada, dikembalikan ke klien. linked_server_name harus merujuk ke definisi server tertaut yang ada di server lokal. Server tertaut didefinisikan dengan menggunakan sp_addlinkedserver.
DENGAN <execute_option>
Kemungkinan opsi eksekusi. Opsi RESULT SETS tidak dapat ditentukan dalam INSERT... Pernyataan EXEC.
AT DATA_SOURCE data_source_name Berlaku untuk: SQL Server 2019 (15.x) dan yang lebih baru
Menentukan bahwa command_string dijalankan terhadap data_source_name dan hasil, jika ada, dikembalikan ke klien. data_source_name harus merujuk ke definisi SUMBER DATA EKSTERNAL yang ada dalam database. Hanya sumber data yang menunjuk ke SQL Server yang didukung. Selain itu, untuk sumber data kluster big data SQL Server yang menunjuk ke kumpulan komputasi, kumpulan data, atau kumpulan penyimpanan didukung. Sumber data ditentukan dengan menggunakan CREATE EXTERNAL DATA SOURCE.
DENGAN <execute_option>
Kemungkinan opsi eksekusi. Opsi RESULT SETS tidak dapat ditentukan dalam INSERT... Pernyataan EXEC.
Term | Definisi |
---|---|
KOMPILASI ULANG | Memaksa rencana baru untuk dikompilasi, digunakan, dan dibuang setelah modul dijalankan. Jika ada rencana kueri yang ada untuk modul, paket ini tetap berada di cache. Gunakan opsi ini jika parameter yang Anda berikan bersifat atipikal atau jika data telah berubah secara signifikan. Opsi ini tidak digunakan untuk prosedur tersimpan yang diperluas. Kami menyarankan agar Anda menggunakan opsi ini dengan hemat karena mahal. Catatan: Anda tidak dapat menggunakan WITH RECOMPILE saat memanggil prosedur tersimpan yang menggunakan sintaks OPENDATASOURCE. Opsi WITH RECOMPILE diabaikan ketika nama objek empat bagian ditentukan. Catatan: RECOMPILE tidak didukung dengan fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar. Jika Anda perlu mengkombinasikan ulang, gunakan sp_recompile (Transact-SQL). |
TATAAN HASIL TIDAK TERDEFINISI | Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru, Azure SQL Database. Opsi ini tidak memberikan jaminan hasil apa, jika ada, yang akan dikembalikan, dan tidak ada definisi yang disediakan. Pernyataan dijalankan tanpa kesalahan jika ada hasil yang dikembalikan atau tidak ada hasil yang dikembalikan. RESULT SETS UNDEFINED adalah perilaku default jika result_sets_option tidak disediakan. Untuk fungsi yang ditentukan pengguna skalar yang ditafsirkan, dan fungsi yang ditentukan pengguna skalar yang dikompilasi secara asli, opsi ini tidak beroperasi karena fungsi tidak pernah mengembalikan tataan hasil. |
TATAAN HASIL TIDAK ADA | Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru, Azure SQL Database. Menjamin bahwa pernyataan eksekusi tidak akan mengembalikan hasil apa pun. Jika ada hasil yang dikembalikan, batch dibatalkan. Untuk fungsi yang ditentukan pengguna skalar yang ditafsirkan, dan fungsi yang ditentukan pengguna skalar yang dikompilasi secara asli, opsi ini tidak beroperasi karena fungsi tidak pernah mengembalikan tataan hasil. |
<result_sets_definition> | Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru, Azure SQL Database. Memberikan jaminan bahwa hasilnya akan kembali seperti yang ditentukan dalam result_sets_definition. Untuk pernyataan yang mengembalikan beberapa kumpulan hasil, berikan beberapa bagian result_sets_definition . Sertakan setiap result_sets_definition dalam tanda kurung, dipisahkan oleh koma. Untuk informasi selengkapnya, lihat <result_sets_definition> nanti dalam topik ini. Opsi ini selalu menghasilkan kesalahan untuk fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar karena fungsi tidak pernah mengembalikan tataan hasil. |
<>result_sets_definition Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru, Azure SQL Database
Menjelaskan kumpulan hasil yang dikembalikan oleh pernyataan yang dijalankan. Klausa result_sets_definition memiliki arti berikut
Term | Definisi |
---|---|
{ column_name data_type [ KOLUSI collation_name ] [NULL | BUKAN NULL] } |
Lihat tabel di bawah. |
db_name | Nama database yang berisi tabel, tampilan, atau fungsi bernilai tabel. |
nama_skema | Nama skema yang memiliki tabel, tampilan, atau fungsi bernilai tabel. |
table_name | view_name | table_valued_function_name | Menentukan bahwa kolom yang dikembalikan akan ditentukan dalam tabel, tampilan, atau fungsi bernilai tabel bernama. Variabel tabel, tabel sementara, dan sinonim tidak didukung dalam sintaks objek AS. |
SEBAGAI JENIS [schema_name.] table_type_name | Menentukan bahwa kolom yang dikembalikan akan ditentukan dalam jenis tabel. |
ADAPUN XML | Menentukan bahwa hasil XML dari pernyataan atau prosedur tersimpan yang disebut oleh pernyataan EXECUTE akan dikonversi ke dalam format seolah-olah mereka diproduksi oleh SELECT ... UNTUK XML ... pernyataan. Semua pemformatan dari direktif jenis dalam pernyataan asli dihapus, dan hasil yang dikembalikan seolah-olah tidak ada direktif jenis yang ditentukan. AS FOR XML tidak mengonversi hasil tabular non-XML dari pernyataan yang dijalankan atau prosedur tersimpan ke XML. |
Term | Definisi |
---|---|
column_name | Nama setiap kolom. Jika jumlah kolom berbeda dari kumpulan hasil, kesalahan terjadi dan batch dibatalkan. Jika nama kolom berbeda dari kumpulan hasil, nama kolom yang dikembalikan akan diatur ke nama yang ditentukan. |
data_type | Jenis data dari setiap kolom. Jika jenis data berbeda, konversi implisit ke jenis data yang ditentukan dilakukan. Jika konversi gagal, batch dibatalkan |
MENYUSUN collation_name | Kolatasi setiap kolom. Jika ada ketidakcocokan kolase, kolase implisit akan dicoba. Jika gagal, batch dibatalkan. |
NULL | BUKAN NULL | Nullability setiap kolom. Jika nullability yang ditentukan BUKAN NULL dan data yang dikembalikan berisi NULL terjadi kesalahan dan batch dibatalkan. Jika tidak ditentukan, nilai default sesuai dengan pengaturan opsi ANSI_NULL_DFLT_ON dan ANSI_NULL_DFLT_OFF. |
Kumpulan hasil aktual yang dikembalikan selama eksekusi dapat berbeda dari hasil yang ditentukan menggunakan klausul WITH RESULT SETS dengan salah satu cara berikut: jumlah kumpulan hasil, jumlah kolom, nama kolom, nullability, dan jenis data. Jika jumlah kumpulan hasil berbeda, kesalahan terjadi dan batch dibatalkan.
Keterangan
Parameter dapat disediakan baik dengan menggunakan nilai atau dengan menggunakan nilai @parameter_name=. Parameter bukan bagian dari transaksi; oleh karena itu, jika parameter diubah dalam transaksi yang kemudian digulung balik, nilai parameter tidak kembali ke nilai sebelumnya. Nilai yang dikembalikan ke pemanggil selalu merupakan nilai pada saat modul kembali.
Penumpukan terjadi ketika satu modul memanggil modul lain atau menjalankan kode terkelola dengan merujuk modul runtime bahasa umum (CLR), jenis yang ditentukan pengguna, atau agregat. Tingkat berlapis bertahpa ketika modul yang disebut atau referensi kode terkelola memulai eksekusi, dan dikurangi ketika modul yang disebut atau referensi kode terkelola telah selesai. Melebihi maksimum 32 tingkat bersarang menyebabkan rantai panggilan lengkap gagal. Tingkat berlapis saat ini disimpan dalam fungsi sistem @@NESTLEVEL.
Karena prosedur tersimpan dari jarak jauh dan prosedur tersimpan yang diperluas tidak berada dalam cakupan transaksi (kecuali dikeluarkan dalam pernyataan BEGIN DISTRIBUTED TRANSACTION atau ketika digunakan dengan berbagai opsi konfigurasi), perintah yang dijalankan melalui panggilan kepada mereka tidak dapat digulung balik. Untuk informasi selengkapnya, lihat Prosedur Tersimpan Sistem (Transact-SQL) dan BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).
Saat Anda menggunakan variabel kursor, jika Anda menjalankan prosedur yang melewati variabel kursor dengan kursor yang dialokasikan untuk itu terjadi kesalahan.
Anda tidak perlu menentukan kata kunci EXECUTE saat menjalankan modul jika pernyataan adalah yang pertama dalam batch.
Untuk informasi tambahan khusus untuk prosedur tersimpan CLR, lihat Prosedur Tersimpan CLR.
Menggunakan EXECUTE dengan Prosedur Tersimpan
Anda tidak perlu menentukan kata kunci EXECUTE ketika Anda menjalankan prosedur tersimpan ketika pernyataan adalah yang pertama dalam batch.
Prosedur tersimpan sistem SQL Server dimulai dengan karakter sp_. Mereka disimpan secara fisik dalam database Sumber Daya, tetapi secara logis muncul dalam skema sys dari setiap sistem dan database yang ditentukan pengguna. Saat Anda menjalankan prosedur tersimpan sistem, baik dalam batch atau di dalam modul seperti prosedur atau fungsi tersimpan yang ditentukan pengguna, kami sarankan Anda memenuhi syarat nama prosedur tersimpan dengan nama skema sys.
Prosedur tersimpan yang diperluas sistem SQL Server dimulai dengan karakter xp_, dan ini terkandung dalam skema dbo database master. Saat Anda menjalankan prosedur tersimpan yang diperluas sistem, baik dalam batch atau di dalam modul seperti prosedur atau fungsi tersimpan yang ditentukan pengguna, kami sarankan Anda memenuhi syarat nama prosedur tersimpan dengan master.dbo.
Saat Anda menjalankan prosedur tersimpan yang ditentukan pengguna, baik dalam batch atau di dalam modul seperti prosedur atau fungsi tersimpan yang ditentukan pengguna, kami sarankan Anda memenuhi syarat nama prosedur tersimpan dengan nama skema. Kami tidak menyarankan Agar Anda memberi nama prosedur tersimpan yang ditentukan pengguna dengan nama yang sama dengan prosedur tersimpan sistem. Untuk informasi selengkapnya tentang menjalankan prosedur tersimpan, lihat Menjalankan Prosedur Tersimpan.
Menggunakan EXECUTE dengan String Karakter
Dalam versi SQL Server yang lebih lama, string karakter dibatasi hingga 8.000 byte. Ini memerlukan penggandaan string besar untuk eksekusi dinamis. Di SQL Server, jenis data varchar(max) dan nvarchar(max) dapat ditentukan yang memungkinkan string karakter hingga 2 gigabyte data.
Perubahan dalam konteks database hanya berlangsung hingga akhir pernyataan EXECUTE. Misalnya, setelah EXEC
dalam pernyataan berikut ini dijalankan, konteks database adalah master.
USE master; EXEC ('USE AdventureWorks2022; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');
Pengalihan Konteks
Anda dapat menggunakan AS { LOGIN | USER } = ' name '
klausul untuk mengalihkan konteks eksekusi pernyataan dinamis. Ketika sakelar konteks ditentukan sebagai EXECUTE ('string') AS <context_specification>
, durasi sakelar konteks dibatasi pada cakupan kueri yang dijalankan.
Menentukan Nama Pengguna atau Login
Nama pengguna atau login yang ditentukan AS { LOGIN | USER } = ' name '
harus ada sebagai prinsipal dalam sys.database_principals atau sys.server_principals, masing-masing, atau pernyataan akan gagal. Selain itu, izin IMPERSONATE harus diberikan pada prinsipal. Kecuali pemanggil adalah pemilik database atau merupakan anggota peran server tetap sysadmin, prinsipal harus ada bahkan ketika pengguna mengakses database atau instans SQL Server melalui keanggotaan grup Windows. Misalnya, asumsikan kondisi berikut:
Grup CompanyDomain\SQLUsers memiliki akses ke database Penjualan.
CompanyDomain\SqlUser1 adalah anggota SQLUsers dan, oleh karena itu, memiliki akses implisit ke database Penjualan.
Meskipun CompanyDomain\SqlUser1 memiliki akses ke database melalui keanggotaan dalam grup SQLUsers, pernyataan EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1'
akan gagal karena CompanyDomain\SqlUser1
tidak ada sebagai prinsipal dalam database.
Praktik Terbaik
Tentukan login atau pengguna yang memiliki hak istimewa paling sedikit yang diperlukan untuk melakukan operasi yang ditentukan dalam pernyataan atau modul. Misalnya, jangan tentukan nama login, yang memiliki izin tingkat server, jika hanya izin tingkat database yang diperlukan; atau tidak menentukan akun pemilik database kecuali izin tersebut diperlukan.
Izin
Izin tidak diperlukan untuk menjalankan pernyataan EXECUTE. Namun, izin diperlukan pada jaminan yang dirujuk dalam string EXECUTE. Misalnya, jika string berisi pernyataan INSERT, pemanggil pernyataan EXECUTE harus memiliki izin INSERT pada tabel target. Izin diperiksa pada saat pernyataan EXECUTE ditemui, bahkan jika pernyataan EXECUTE disertakan dalam modul.
Izin EXECUTE untuk modul secara default ke pemilik modul, yang dapat mentransfernya ke pengguna lain. Saat modul dijalankan yang menjalankan string, izin diperiksa dalam konteks pengguna yang menjalankan modul, bukan dalam konteks pengguna yang membuat modul. Namun, jika pengguna yang sama memiliki modul panggilan dan modul yang dipanggil, pemeriksaan izin EXECUTE tidak dilakukan untuk modul kedua.
Jika modul mengakses objek database lain, eksekusi berhasil ketika Anda memiliki izin EXECUTE pada modul dan salah satu hal berikut ini benar:
Modul ditandai EXECUTE AS USER atau SELF, dan pemilik modul memiliki izin yang sesuai pada objek yang direferensikan. Untuk informasi selengkapnya tentang peniruan dalam modul, lihat EXECUTE AS Clause (Transact-SQL).
Modul ditandai SEBAGAI EXECUTE AS CALLER, dan Anda memiliki izin yang sesuai pada objek.
Modul ditandai EXECUTE AS user_name, dan user_name memiliki izin yang sesuai pada objek.
Izin Peralihan Konteks
Untuk menentukan EXECUTE AS pada login, pemanggil harus memiliki izin IMPERSONATE pada nama masuk yang ditentukan. Untuk menentukan EXECUTE AS pada pengguna database, pemanggil harus memiliki izin IMPERSONATE pada nama pengguna yang ditentukan. Ketika tidak ada konteks eksekusi yang ditentukan, atau EXECUTE AS CALLER ditentukan, izin IMPERSONATE tidak diperlukan.
Contoh: SQL Server
J. Menggunakan EXECUTE untuk meneruskan satu parameter
Prosedur uspGetEmployeeManagers
tersimpan dalam database AdventureWorks2022 mengharapkan satu parameter (@EmployeeID
). Contoh berikut menjalankan prosedur tersimpan uspGetEmployeeManagers
dengan Employee ID 6
sebagai nilai parameternya.
EXEC dbo.uspGetEmployeeManagers 6;
GO
Variabel dapat secara eksplisit dinamai dalam eksekusi:
EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
Jika berikut ini adalah pernyataan pertama dalam batch atau skrip osql atau sqlcmd , EXEC tidak diperlukan.
dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
B. Menggunakan beberapa parameter
Contoh berikut menjalankan spGetWhereUsedProductID
prosedur tersimpan dalam database AdventureWorks2022. Ini melewati dua parameter: parameter pertama adalah ID produk (819
) dan parameter kedua, @CheckDate,
adalah datetime
nilai.
DECLARE @CheckDate DATETIME;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
C. Menggunakan EXECUTE 'tsql_string' dengan variabel
Contoh berikut menunjukkan cara EXECUTE
menangani string yang dibangun secara dinamis yang berisi variabel. Contoh ini membuat tables_cursor
kursor untuk menyimpan daftar semua tabel yang ditentukan pengguna dalam database, lalu menggunakan daftar tersebut AdventureWorks2022
untuk membangun kembali semua indeks pada tabel.
DECLARE tables_cursor CURSOR
FOR
SELECT s.name, t.name
FROM sys.objects AS t
JOIN sys.schemas AS s ON s.schema_id = t.schema_id
WHERE t.type = 'U';
OPEN tables_cursor;
DECLARE @schemaname sysname;
DECLARE @tablename sysname;
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
WHILE (@@FETCH_STATUS <> -1)
BEGIN;
EXECUTE ('ALTER INDEX ALL ON ' + @schemaname + '.' + @tablename + ' REBUILD;');
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
END;
PRINT 'The indexes on all tables have been rebuilt.';
CLOSE tables_cursor;
DEALLOCATE tables_cursor;
GO
D. Menggunakan EXECUTE dengan prosedur tersimpan jarak jauh
Contoh berikut menjalankan prosedur tersimpan uspGetEmployeeManagers
di server SQLSERVER1
jarak jauh dan menyimpan status pengembalian yang menunjukkan keberhasilan atau kegagalan di @retstat
.
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru
DECLARE @retstat INT;
EXECUTE @retstat = SQLSERVER1.AdventureWorks2022.dbo.uspGetEmployeeManagers @BusinessEntityID = 6;
E. Menggunakan EXECUTE dengan variabel prosedur tersimpan
Contoh berikut membuat variabel yang mewakili nama prosedur tersimpan.
DECLARE @proc_name VARCHAR(30);
SET @proc_name = 'sys.sp_who';
EXEC @proc_name;
F. Menggunakan EXECUTE dengan DEFAULT
Contoh berikut membuat prosedur tersimpan dengan nilai default untuk parameter pertama dan ketiga. Ketika prosedur dijalankan, default ini disisipkan untuk parameter pertama dan ketiga ketika tidak ada nilai yang diteruskan dalam panggilan atau ketika default ditentukan. Perhatikan berbagai cara DEFAULT
kata kunci dapat digunakan.
IF OBJECT_ID(N'dbo.ProcTestDefaults', N'P')IS NOT NULL
DROP PROCEDURE dbo.ProcTestDefaults;
GO
-- Create the stored procedure.
CREATE PROCEDURE dbo.ProcTestDefaults (
@p1 SMALLINT = 42,
@p2 CHAR(1),
@p3 VARCHAR(8) = 'CAR')
AS
SET NOCOUNT ON;
SELECT @p1, @p2, @p3
;
GO
Prosedur Proc_Test_Defaults
tersimpan dapat dijalankan dalam banyak kombinasi.
-- Specifying a value only for one parameter (@p2).
EXECUTE dbo.ProcTestDefaults @p2 = 'A';
-- Specifying a value for the first two parameters.
EXECUTE dbo.ProcTestDefaults 68, 'B';
-- Specifying a value for all three parameters.
EXECUTE dbo.ProcTestDefaults 68, 'C', 'House';
-- Using the DEFAULT keyword for the first parameter.
EXECUTE dbo.ProcTestDefaults @p1 = DEFAULT, @p2 = 'D';
-- Specifying the parameters in an order different from the order defined in the procedure.
EXECUTE dbo.ProcTestDefaults DEFAULT, @p3 = 'Local', @p2 = 'E';
-- Using the DEFAULT keyword for the first and third parameters.
EXECUTE dbo.ProcTestDefaults DEFAULT, 'H', DEFAULT;
EXECUTE dbo.ProcTestDefaults DEFAULT, 'I', @p3 = DEFAULT;
G. Menggunakan EXECUTE dengan AT linked_server_name
Contoh berikut meneruskan string perintah ke server jarak jauh. Ini membuat server SeattleSales
tertaut yang menunjuk ke instans SQL Server lain dan menjalankan pernyataan DDL (CREATE TABLE
) terhadap server tertaut tersebut.
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
EXECUTE ( 'CREATE TABLE AdventureWorks2022.dbo.SalesTbl
(SalesID int, SalesName varchar(10)) ; ' ) AT SeattleSales;
GO
H. Menggunakan EXECUTE WITH RECOMPILE
Contoh berikut menjalankan Proc_Test_Defaults
prosedur tersimpan dan memaksa rencana kueri baru untuk dikompilasi, digunakan, dan dibuang setelah modul dijalankan.
EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO
I. Menggunakan EXECUTE dengan fungsi yang ditentukan pengguna
Contoh berikut menjalankan ufnGetSalesOrderStatusText
fungsi skalar yang ditentukan pengguna dalam database AdventureWorks2022. Ini menggunakan variabel @returnstatus
untuk menyimpan nilai yang dikembalikan oleh fungsi . Fungsi mengharapkan satu parameter input, @Status
. Ini didefinisikan sebagai jenis data kecil .
DECLARE @returnstatus NVARCHAR(15);
SET @returnstatus = NULL;
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;
PRINT @returnstatus;
GO
j. Menggunakan EXECUTE untuk mengkueri database Oracle di server tertaut
Contoh berikut menjalankan beberapa SELECT
pernyataan di server Oracle jarak jauh. Contoh dimulai dengan menambahkan server Oracle sebagai server tertaut dan membuat login server tertaut.
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru
-- Setup the linked server.
EXEC sp_addlinkedserver
@server='ORACLE',
@srvproduct='Oracle',
@provider='OraOLEDB.Oracle',
@datasrc='ORACLE10';
EXEC sp_addlinkedsrvlogin
@rmtsrvname='ORACLE',
@useself='false',
@locallogin=null,
@rmtuser='scott',
@rmtpassword='tiger';
EXEC sp_serveroption 'ORACLE', 'rpc out', true;
GO
-- Execute several statements on the linked Oracle server.
EXEC ( 'SELECT * FROM scott.emp') AT ORACLE;
GO
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO
DECLARE @v INT;
SET @v = 7902;
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;
GO
K. Menggunakan EXECUTE AS USER untuk mengalihkan konteks ke pengguna lain
Contoh berikut menjalankan string Transact-SQL yang membuat tabel dan menentukan klausul AS USER
untuk mengalihkan konteks eksekusi pernyataan dari pemanggil ke User1
. Mesin Database akan memeriksa izin User1
kapan pernyataan dijalankan. User1
harus ada sebagai pengguna dalam database dan harus memiliki izin untuk membuat tabel dalam Sales
skema, atau pernyataan gagal.
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID INT, SalesName VARCHAR(10));')
AS USER = 'User1';
GO
L. Menggunakan parameter dengan EXECUTE dan AT linked_server_name
Contoh berikut meneruskan string perintah ke server jarak jauh dengan menggunakan tempat penampung tanda tanya (?
) untuk parameter. Contoh membuat server SeattleSales
tertaut yang menunjuk ke instans SELECT
SQL Server lain dan menjalankan pernyataan terhadap server tertaut tersebut. Pernyataan menggunakan SELECT
tanda tanya sebagai tempat penampung untuk ProductID
parameter (952
), yang disediakan setelah pernyataan.
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru
-- Setup the linked server.
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name
FROM AdventureWorks2022.Production.Product
WHERE ProductID = ? ', 952) AT SeattleSales;
GO
M. Menggunakan EXECUTE untuk menentukan ulang satu tataan hasil
Beberapa contoh sebelumnya dijalankan EXEC dbo.uspGetEmployeeManagers 6;
yang mengembalikan 7 kolom. Contoh berikut menunjukkan menggunakan WITH RESULT SET
sintaks untuk mengubah nama dan jenis data dari tataan hasil yang dikembalikan.
Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru, Azure SQL Database
EXEC uspGetEmployeeManagers 16
WITH RESULT SETS
(
([Reporting Level] INT NOT NULL,
[ID of Employee] INT NOT NULL,
[Employee First Name] NVARCHAR(50) NOT NULL,
[Employee Last Name] NVARCHAR(50) NOT NULL,
[Employee ID of Manager] NVARCHAR(max) NOT NULL,
[Manager First Name] NVARCHAR(50) NOT NULL,
[Manager Last Name] NVARCHAR(50) NOT NULL )
);
N. Menggunakan EXECUTE untuk menentukan ulang dua tataan hasil
Saat menjalankan pernyataan yang mengembalikan lebih dari satu tataan hasil, tentukan setiap tataan hasil yang diharapkan. Contoh berikut dalam AdventureWorks2022
membuat prosedur yang mengembalikan dua tataan hasil. Kemudian prosedur dijalankan menggunakan klausa WITH RESULT SETS , dan menentukan dua definisi tataan hasil.
Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru, Azure SQL Database
--Create the procedure
CREATE PROC Production.ProductList @ProdName NVARCHAR(50)
AS
-- First result set
SELECT ProductID, Name, ListPrice
FROM Production.Product
WHERE Name LIKE @ProdName;
-- Second result set
SELECT Name, COUNT(S.ProductID) AS NumberOfOrders
FROM Production.Product AS P
JOIN Sales.SalesOrderDetail AS S
ON P.ProductID = S.ProductID
WHERE Name LIKE @ProdName
GROUP BY Name;
GO
-- Execute the procedure
EXEC Production.ProductList '%tire%'
WITH RESULT SETS
(
(ProductID INT, -- first result set definition starts here
Name NAME,
ListPrice MONEY)
, -- comma separates result set definitions
(Name NAME, -- second result set definition starts here
NumberOfOrders INT)
);
O. Menggunakan EXECUTE dengan AT DATA_SOURCE data_source_name untuk mengkueri SQL Server jarak jauh
Contoh berikut meneruskan string perintah ke sumber data eksternal yang menunjuk ke instans SQL Server.
Berlaku untuk: SQL Server 2019 (15.x) dan yang lebih baru
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE my_sql_server;
GO
P. Menggunakan EXECUTE dengan AT DATA_SOURCE data_source_name untuk mengkueri kumpulan komputasi di Kluster Big Data SQL Server
Contoh berikut meneruskan string perintah ke sumber data eksternal yang menunjuk ke kumpulan komputasi di Kluster Big Data SQL Server. Contoh membuat sumber SqlComputePool
data terhadap kumpulan komputasi di Kluster Big Data SQL Server dan menjalankan SELECT
pernyataan terhadap sumber data.
Berlaku untuk: SQL Server 2019 (15.x) dan yang lebih baru
CREATE EXTERNAL DATA SOURCE SqlComputePool
WITH (LOCATION = 'sqlcomputepool://controller-svc/default');
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE SqlComputePool;
GO
T. Menggunakan EXECUTE dengan AT DATA_SOURCE data_source_name untuk mengkueri kumpulan data di Kluster Big Data SQL Server
Contoh berikut meneruskan string perintah ke sumber data eksternal yang menunjuk ke kumpulan komputasi di kluster big data SQL Server. Contoh membuat sumber SqlDataPool
data terhadap kumpulan data di kluster big data SQL Server dan menjalankan SELECT
pernyataan terhadap sumber data.
Berlaku untuk: SQL Server 2019 (15.x) dan yang lebih baru
CREATE EXTERNAL DATA SOURCE SqlDataPool
WITH (LOCATION = 'sqldatapool://controller-svc/default');
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE SqlDataPool;
GO
R. Menggunakan EXECUTE dengan AT DATA_SOURCE data_source_name untuk mengkueri kumpulan penyimpanan di Kluster Big Data SQL Server
Contoh berikut meneruskan string perintah ke sumber data eksternal yang menunjuk ke kumpulan komputasi di Kluster Big Data SQL Server. Contoh membuat sumber SqlStoragePool
data terhadap kumpulan data di Kluster Big Data SQL Server dan menjalankan SELECT
pernyataan terhadap sumber data.
Berlaku untuk: SQL Server 2019 (15.x) dan yang lebih baru
CREATE EXTERNAL DATA SOURCE SqlStoragePool
WITH (LOCATION = 'sqlhdfs://controller-svc/default');
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE SqlStoragePool;
GO
Contoh: Azure Synapse Analytics
J: Eksekusi Prosedur Dasar
Menjalankan prosedur tersimpan:
EXEC proc1;
Memanggil prosedur tersimpan dengan nama yang ditentukan pada runtime:
EXEC ('EXEC ' + @var);
Memanggil prosedur tersimpan dari dalam prosedur tersimpan:
CREATE sp_first AS EXEC sp_second; EXEC sp_third;
B: Menjalankan String
Menjalankan string SQL:
EXEC ('SELECT * FROM sys.types');
Menjalankan string berlapis:
EXEC ('EXEC (''SELECT * FROM sys.types'')');
Menjalankan variabel string:
DECLARE @stringVar NVARCHAR(100);
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';
EXEC (@stringVar);
C: Prosedur dengan Parameter
Contoh berikut membuat prosedur dengan parameter dan menunjukkan 3 cara untuk menjalankan prosedur:
-- Uses AdventureWorks
CREATE PROC ProcWithParameters
@name NVARCHAR(50),
@color NVARCHAR(15)
AS
SELECT ProductKey, EnglishProductName, Color FROM [dbo].[DimProduct]
WHERE EnglishProductName LIKE @name
AND Color = @color;
GO
-- Executing using positional parameters
EXEC ProcWithParameters N'%arm%', N'Black';
-- Executing using named parameters in order
EXEC ProcWithParameters @name = N'%arm%', @color = N'Black';
-- Executing using named parameters out of order
EXEC ProcWithParameters @color = N'Black', @name = N'%arm%';
GO
Lihat Juga
@@NESTLEVEL (T-SQL)
DECLARE @local_variable (Transact-SQL)
Klausa EXECUTE AS (Transact-SQL)
Utilitas osql
Prinsipal (Mesin Database)
KEMBALIkan (T-SQL)
sp_addlinkedserver (T-SQL)
Utilitas sqlcmd
SUSER_NAME (T-SQL)
sys.database_principals (T-SQL)
sys.server_principals (T-SQL)
USER_NAME (T-SQL)
OPENDATASOURCE (Transact-SQL)
Fungsi Yang Ditentukan Pengguna Skalar untuk OLTP Dalam Memori