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.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistem Platform Analitik (PDW)
Titik akhir analitik SQL di Microsoft Fabric
Gudang di Microsoft Fabric
Database SQL 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 EXEC atau EXECUTE dapat digunakan untuk mengirim perintah pass-through ke server yang ditautkan. 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.
Important
Sebelum Anda memanggil EXECUTE dengan string karakter, validasi string karakter. Jangan pernah menjalankan perintah yang dibangun dari input pengguna yang belum divalidasi.
Syntax
Blok kode berikut menunjukkan sintaks di SQL Server 2019 (15.x) dan versi yang lebih baru. Atau, lihat sintaks di SQL Server 2017 dan yang lebih lama sebagai gantinya.
Sintaks untuk SQL Server 2019 dan versi yang lebih baru.
-- 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 dalam SQL Server 2017 (14.x) dan versi yang lebih lama. Atau, lihat sintaks di SQL Server 2019 sebagai gantinya.
Sintaks untuk SQL Server 2017 dan versi yang lebih lama.
-- 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
}
Sintaks untuk 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 ] ) }
}
Sintaks untuk 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
}
Sintaks untuk Azure Synapse Analytics dan Gudang Data Paralel.
-- 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 ] )
[ ; ]
Sintaks untuk 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 ] ) }
}
Arguments
@return_status
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
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 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.
;number
Bilangan bulat opsional yang digunakan untuk mengelompokkan prosedur dengan nama yang sama. Parameter ini tidak digunakan untuk prosedur tersimpan yang diperluas.
Note
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.
@module_name_var
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
Parameter untuk module_name, seperti yang didefinisikan dalam modul. Nama parameter harus didahului dengan tanda (@). Saat digunakan dengan nilai @parameter_name = formulir, nama parameter dan konstanta tidak perlu disediakan dalam urutan yang ditentukan dalam modul. Namun, jika nilai @parameter_name = formulir digunakan untuk parameter apa pun, itu harus digunakan untuk semua parameter berikutnya.
Secara default, parameter dapat diubah ke null.
value
Nilai parameter yang akan 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
Jika default ditentukan dalam modul, pengguna dapat menjalankan modul tanpa menentukan parameter.
Defaultnya juga dapat NULL. Umumnya, definisi modul menentukan tindakan yang harus diambil jika nilai parameter NULL.
@variable
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 kata kunci OUTPUT. 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 yang sesuai yang dilakukan oleh penyedia OLE DB disalin kembali ke variabel di akhir eksekusi modul.
Jika parameter OUTPUT digunakan dan niatnya adalah menggunakan nilai pengembalian dalam pernyataan lain dalam batch atau modul panggilan, nilai parameter harus diteruskan sebagai variabel, seperti @parameter = @variable. 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
Nama variabel lokal.
[N]'tsql_string'
String konstanta.
tsql_string dapat berupa jenis data nvarchar atau varchar apa pun. Jika
AS context_specification
Menentukan konteks di mana pernyataan dijalankan.
LOGIN
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.
Important
Meskipun konteks beralih ke pengguna database aktif, setiap upaya untuk mengakses sumber daya di luar database menyebabkan pernyataan gagal. Ini termasuk pernyataan USE <database>, kueri terdistribusi, dan kueri yang mereferensikan database lain dengan menggunakan pengidentifikasi tiga bagian atau empat bagian.
'name'
Nama pengguna atau login yang valid. Argumen nama
Argumen ini tidak boleh menjadi akun bawaan, seperti NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, atau NT AUTHORITY\LocalSystem.
Untuk informasi selengkapnya, lihat Menentukan Nama Pengguna atau Login nanti di artikel ini.
[N]'command_string'
String konstanta yang berisi perintah yang akan diteruskan ke server tertaut. Jika
[?]
Menunjukkan parameter yang nilainya disediakan dalam <arg-list> perintah pass-through yang digunakan dalam pernyataan EXECUTE ('...', <arg-list>) AT <linkedsrv>.
PADA linked_server_name
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.
WITH <execute_option>Kemungkinan opsi eksekusi. Opsi
RESULT SETStidak dapat ditentukan dalam pernyataanINSERT...EXECUTE.
DATA_SOURCE_NAME AT DATA_SOURCE
Berlaku untuk: SQL Server 2019 (15.x) dan versi 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 EXTERNAL DATA SOURCE 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.
WITH <execute_option>Kemungkinan opsi eksekusi. Opsi
RESULT SETStidak dapat ditentukan dalam pernyataanINSERT...EXECUTE.Term Definition RECOMPILEMemaksa rencana baru untuk dikompilasi, digunakan, dan dibuang setelah modul dijalankan. Jika ada rencana kueri yang sudah 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 menggunakanWITH RECOMPILEsaat memanggil prosedur tersimpan yang menggunakan sintaksOPENDATASOURCE. OpsiWITH RECOMPILEdiabaikan ketika nama objek empat bagian ditentukan.
Catatan:RECOMPILEtidak didukung dengan fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar. Jika Anda perlu mengkombinasikan ulang, gunakan sp_recompile.RESULT SETS UNDEFINEDOpsi ini tidak memberikan jaminan hasil apa, jika ada, yang dikembalikan, dan tidak ada definisi yang disediakan. Pernyataan dijalankan tanpa kesalahan jika ada hasil yang dikembalikan atau tidak ada hasil yang dikembalikan. RESULT SETS UNDEFINEDadalah 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.
Berlaku untuk: SQL Server 2012 (11.x) dan versi yang lebih baru, dan Azure SQL Database.RESULT SETS NONEMenjamin bahwa pernyataan EXECUTEtidak 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.
Berlaku untuk: SQL Server 2012 (11.x) dan versi yang lebih baru, dan Azure SQL Database.<result_sets_definition>Memberikan jaminan bahwa hasilnya 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 di artikel ini.
Opsi ini selalu menghasilkan kesalahan untuk fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar karena fungsi tidak pernah mengembalikan tataan hasil.
Berlaku untuk: SQL Server 2012 (11.x) dan versi yang lebih baru, dan Azure SQL Database.<result_sets_definition>menjelaskan kumpulan hasil yang dikembalikan oleh pernyataan yang dijalankan. Klausaresult_sets_definitionmemiliki arti berikut:Term Definition { column_name data_type
[ KUMPULKAN collation_name ]
[NULL | BUKAN NULL] }Lihat tabel berikut ini. db_name Nama database yang berisi tabel, tampilan, atau fungsi bernilai tabel. schema_name Nama skema yang memiliki fungsi bernilai tabel, tampilan, atau tabel. table_name | view_name | table_valued_function_name Menentukan bahwa kolom yang dikembalikan adalah kolom yang 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 adalah kolom yang ditentukan dalam jenis tabel. ADAPUN XML Menentukan bahwa hasil XML dari pernyataan atau prosedur tersimpan yang dipanggil oleh pernyataan EXECUTEdikonversi ke dalam format seolah-olah dihasilkan oleh pernyataanSELECT ... FOR XML .... Semua pemformatan dari direktif jenis dalam pernyataan asli dihapus, dan hasil yang dikembalikan seolah-olah tidak ada direktif jenis yang ditentukan.AS FOR XMLtidak mengonversi hasil tabular non-XML dari pernyataan yang dijalankan atau prosedur tersimpan ke XML.Term Definition 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 NOT NULLdan data yang dikembalikan berisi null, kesalahan terjadi dan batch dibatalkan. Jika tidak ditentukan, nilai default sesuai dengan pengaturan opsiANSI_NULL_DFLT_ONdanANSI_NULL_DFLT_OFF.Kumpulan hasil aktual yang dikembalikan selama eksekusi dapat berbeda dari hasil yang ditentukan menggunakan klausul
WITH RESULT SETSdengan 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.
Remarks
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. Kenaikan tingkat berlapis ketika modul yang disebut atau referensi kode terkelola memulai eksekusi, dan penurunan saat modul yang disebut atau referensi kode terkelola 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 dan MULAI TRANSAKSI TERDISTRIBUSI.
Saat Anda menggunakan variabel kursor, jika Anda menjalankan prosedur yang melewati variabel kursor dengan kursor yang dialokasikan untuk itu, kesalahan terjadi.
Anda tidak perlu menentukan kata kunci EXECUTE saat menjalankan modul jika pernyataan adalah yang pertama dalam batch.
Untuk informasi selengkapnya khusus untuk prosedur tersimpan CLR, lihat Prosedur Tersimpan CLR.
Menggunakan EXECUTE dengan prosedur tersimpan
Anda tidak perlu menentukan kata kunci EXECUTE saat menjalankan prosedur tersimpan ketika pernyataan adalah yang pertama dalam batch.
Prosedur tersimpan sistem SQL Server dimulai dengan karakter sp_. Mereka disimpan secara fisik dalam
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
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 EXECUTE dalam pernyataan berikut ini dijalankan, konteks database master.
USE master;
EXECUTE ('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.
Tentukan nama pengguna atau login
Nama pengguna atau login yang ditentukan dalam AS { LOGIN | USER } = '<name>' harus ada sebagai prinsipal dalam sys.database_principals atau sys.server_principals, atau pernyataan gagal. Selain itu, izin IMPERSONATE harus diberikan pada prinsipal. Kecuali pemanggil adalah pemilik database atau merupakan anggota sysadmin peran server tetap, prinsipal harus ada bahkan ketika pengguna mengakses database atau instans SQL Server melalui keanggotaan grup Windows. Misalnya, asumsikan kondisi berikut:
grup
CompanyDomain\SQLUsersmemiliki akses ke databaseSales.CompanyDomain\SqlUser1adalah anggotaSQLUsersdan, oleh karena itu, memiliki akses implisit ke databaseSales.
Meskipun CompanyDomain\SqlUser1 memiliki akses ke database melalui keanggotaan dalam grup SQLUsers, pernyataan EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' 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, jangan tentukan akun pemilik database kecuali izin tersebut diperlukan.
Permissions
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.
Bagaimana Mesin Database mengevaluasi izin pada objek yang dirujuk dalam modul bergantung pada rantai kepemilikan yang ada antara objek panggilan dan objek yang dirujuk.
EXECUTE izin untuk modul secara default kepada 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, EXECUTE pemeriksaan izin tidak dilakukan untuk modul kedua.
Jika modul mengakses objek database lain, eksekusi berhasil ketika Anda memiliki izin EXECUTE pada modul dan salah satu kondisi berikut ini benar:
Modul ditandai
EXECUTE AS USERatauEXECUTE AS SELF, dan pemilik modul memiliki izin yang sesuai pada objek yang direferensikan. Untuk informasi selengkapnya tentang peniruan dalam modul, lihat klausa EXECUTE AS.Modul ditandai
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
Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.
A. Gunakan EXECUTE untuk meneruskan satu parameter
Prosedur uspGetEmployeeManagers tersimpan dalam database AdventureWorks2025 mengharapkan satu parameter (@EmployeeID). Contoh berikut menjalankan prosedur tersimpan uspGetEmployeeManagers dengan Employee ID 6 sebagai nilai parameternya.
EXECUTE dbo.uspGetEmployeeManagers 6;
GO
Variabel dapat secara eksplisit dinamai dalam eksekusi:
EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
Jika berikut ini adalah pernyataan pertama dalam batch atau skrip sqlcmd, EXECUTE tidak diperlukan.
EXECUTE dbo.uspGetEmployeeManagers 6;
GO
--Or
EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
B. Menggunakan beberapa parameter
Contoh berikut menjalankan spGetWhereUsedProductID prosedur tersimpan dalam database AdventureWorks2025. Ini melewati dua parameter: parameter pertama adalah ID produk (
DECLARE @CheckDate AS DATETIME;
SET @CheckDate = GETDATE();
EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
C. Gunakan 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 AdventureWorks2025 untuk membangun kembali semua indeks pada tabel.
DECLARE tables_cursor CURSOR
FOR SELECT s.name, t.name FROM sys.objects AS t
INNER JOIN sys.schemas AS s ON s.schema_id = t.schema_id
WHERE t.type = 'U';
OPEN tables_cursor;
DECLARE @schemaname AS sysname;
DECLARE @tablename AS 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;
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.
DECLARE @retstat AS 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 AS VARCHAR (30);
SET @proc_name = 'sys.sp_who';
EXECUTE @proc_name;
F. Gunakan 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. Gunakan 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.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO
EXECUTE ('CREATE TABLE AdventureWorks2022.dbo.SalesTbl
(SalesID INT, SalesName VARCHAR(10)); ') AT SeattleSales;
GO
H. Gunakan JALANKAN DENGAN KOMPILASI ULANG
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 AdventureWorks2025. 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 AS NVARCHAR (15);
SET @returnstatus = NULL;
EXECUTE
@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.
-- Setup the linked server.
EXECUTE sp_addlinkedserver
@server = 'ORACLE',
@srvproduct = 'Oracle',
@provider = 'OraOLEDB.Oracle',
@datasrc = 'ORACLE10';
EXECUTE sp_addlinkedsrvlogin
@rmtsrvname = 'ORACLE',
@useself = 'false',
@locallogin = NULL,
@rmtuser = 'scott',
@rmtpassword = 'tiger';
EXECUTE sp_serveroption 'ORACLE', 'rpc out', true;
GO
-- Execute several statements on the linked Oracle server.
EXECUTE ('SELECT * FROM scott.emp') AT ORACLE;
GO
EXECUTE ('SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO
DECLARE @v AS INT;
SET @v = 7902;
EXECUTE ('SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;
GO
K. Gunakan 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 memeriksa izin User1 saat 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.
-- Setup the linked server.
EXECUTE 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. Gunakan EXECUTE untuk menentukan ulang satu tataan hasil
Berlaku untuk: SQL Server 2012 (11.x) dan versi yang lebih baru, dan Azure SQL Database.
Beberapa contoh sebelumnya dijalankan EXECUTE dbo.uspGetEmployeeManagers 6; yang mengembalikan tujuh kolom. Contoh berikut menunjukkan menggunakan WITH RESULT SET sintaks untuk mengubah nama dan jenis data dari tataan hasil yang dikembalikan.
EXECUTE 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. Gunakan EXECUTE untuk menentukan ulang dua tataan hasil
Berlaku untuk: SQL Server 2012 (11.x) dan versi yang lebih baru, dan Azure SQL Database.
Saat menjalankan pernyataan yang mengembalikan lebih dari satu tataan hasil, tentukan setiap tataan hasil yang diharapkan. Contoh berikut dalam AdventureWorks2025 membuat prosedur yang mengembalikan dua tataan hasil. Kemudian prosedur dijalankan menggunakan klausa WITH RESULT SETS, dan menentukan dua definisi tataan hasil.
--Create the procedure
CREATE PROCEDURE 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
INNER JOIN Sales.SalesOrderDetail AS S
ON P.ProductID = S.ProductID
WHERE Name LIKE @ProdName
GROUP BY Name;
GO
-- Execute the procedure
EXECUTE Production.ProductList '%tire%' WITH RESULT SETS
(
-- first result set definition starts here
(ProductID INT, [Name] NAME, ListPrice MONEY)
-- comma separates result set definitions
,
-- second result set definition starts here
([Name] NAME, NumberOfOrders INT)
);
O. Menggunakan EXECUTE dengan AT DATA_SOURCE data_source_name untuk mengkueri SQL Server jarak jauh
Berlaku untuk: SQL Server 2019 (15.x) dan versi yang lebih baru.
Contoh berikut meneruskan string perintah ke sumber data eksternal yang menunjuk ke instans SQL Server.
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
Berlaku untuk: SQL Server 2019 (15.x).
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.
CREATE EXTERNAL DATA SOURCE SqlComputePool
WITH (LOCATION = 'sqlcomputepool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlComputePool;
GO
Q. Menggunakan EXECUTE dengan AT DATA_SOURCE data_source_name untuk mengkueri kumpulan data di Kluster Big Data SQL Server
Berlaku untuk: SQL Server 2019 (15.x).
Contoh berikut meneruskan string perintah ke sumber data eksternal yang menunjuk ke kumpulan komputasi di SQL Server Big Data Cluster (BDC). Contoh membuat sumber data SqlDataPool terhadap kumpulan data di BDC dan menjalankan pernyataan SELECT terhadap sumber data.
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
Berlaku untuk: SQL Server 2019 (15.x).
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.
CREATE EXTERNAL DATA SOURCE SqlStoragePool
WITH (LOCATION = 'sqlhdfs://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlStoragePool;
GO
Contoh: Azure Synapse Analytics
Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.
J: Eksekusi prosedur dasar
Jalankan prosedur tersimpan:
EXECUTE proc1;
Panggil prosedur tersimpan dengan nama yang ditentukan saat runtime:
EXECUTE ('EXECUTE ' + @var);
Panggil prosedur tersimpan dari dalam prosedur tersimpan:
CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;
B: Menjalankan string
Jalankan string SQL:
EXECUTE ('SELECT * FROM sys.types');
Jalankan string berlapis:
EXECUTE ('EXECUTE (''SELECT * FROM sys.types'')');
Jalankan variabel string:
DECLARE @stringVar AS NVARCHAR (100);
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';
EXECUTE (@stringVar);
C: Prosedur dengan parameter
Contoh berikut membuat prosedur dengan parameter dan menunjukkan tiga cara untuk menjalankan prosedur:
CREATE PROCEDURE ProcWithParameters (
@name NVARCHAR (50),
@color NVARCHAR (15)
)
AS
SELECT ProductKey,
EnglishProductName,
Color
FROM [dbo].[DimProduct]
WHERE EnglishProductName LIKE @namef
AND Color = @color;
GO
Jalankan menggunakan parameter posisi:
EXECUTE ProcWithParameters N'%arm%', N'Black';
Jalankan menggunakan parameter bernama secara berurutan:
EXECUTE ProcWithParameters
@name = N'%arm%',
@color = N'Black';
Jalankan menggunakan parameter bernama di luar urutan:
EXECUTE ProcWithParameters
@color = N'Black',
@name = N'%arm%';
GO
Konten terkait
- @@NESTLEVEL (Transact-SQL)
- DECLARE @local_variable (Transact-SQL)
- Klausul EXECUTE AS (Transact-SQL)
- Utilitas osql
- Prinsipal (Mesin Database)
- KEMBALIkan (Transact-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