EXECUTE (Transact-SQL)
Berlaku untuk:
SQL Server (semua versi yang didukung)
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
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 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.
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 dalam SQL Server 2019. Atau, lihat sintaks di SQL Server 2017 dan yang lebih lama sebagai gantinya.
-- Syntax for SQL Server 2019
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 ] )
[;]
Catatan
Untuk melihat sintaks transact-SQL untuk SQL Server 2014 dan 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 bernilai skalar yang ditentukan pengguna, 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 bernilai skalar yang ditentukan pengguna untuk dipanggil. Nama modul harus mematuhi aturan untuk pengidentifikasi. Nama-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 berjalan 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.
; Nomor
Berlaku untuk: SQL Server 2008 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 Microsoft 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 skalar yang ditentukan pengguna.
@parameter
Adalah parameter untuk module_name, seperti yang didefinisikan dalam modul. Nama parameter harus didahului oleh tanda (@). Ketika digunakan dengan formulirnilai @parameter_name=, nama parameter dan konstanta tidak harus disediakan dalam urutan di mana mereka didefinisikan dalam modul. Namun, jika formulirnilai @parameter_name= digunakan untuk parameter apa pun, formulir tersebut harus digunakan untuk semua parameter berikutnya.
Secara default, parameter dapat diubah ke null.
nilai
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 yang ditautkan, urutan nilai parameter bergantung pada penyedia OLE DB dari 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 didefinisikan 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 yang sesuai yang dilakukan oleh penyedia OLE DB akan disalin kembali ke variabel di akhir eksekusi modul.
Jika parameter OUTPUT digunakan dan niatnya adalah menggunakan nilai yang dikembalikan 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
Memasok 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 char, 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 .
AS <context_specification>
Menentukan konteks di mana pernyataan dijalankan.
MASUK
Berlaku untuk: SQL Server 2008 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 boleh 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 yang ditautkan. 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 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 TATAAN HASIL 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 SQL Server sumber data kluster big data 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 TATAAN HASIL tidak dapat ditentukan dalam INSERT... Pernyataan EXEC.
| Persyaratan | Definisi |
|---|---|
| KOMPILASI ULANG | Memaksa rencana baru untuk dikompilasi, digunakan, dan dibuang setelah modul dijalankan. Jika ada rencana kueri yang ada untuk modul, rencana 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 saat nama objek empat bagian ditentukan. Catatan: RECOMPILE tidak didukung dengan fungsi yang dikompilasi secara asli dan skalar yang ditentukan pengguna. 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 skalar yang ditentukan pengguna 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 skalar yang ditentukan pengguna 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 skalar yang ditentukan pengguna karena fungsi tidak pernah mengembalikan tataan hasil. |
<> result_sets_definitionBerlaku 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
| Persyaratan | Definisi |
|---|---|
| { column_name data_type [SUSUN collation_name] [| NULL TIDAK NULL] } |
Lihat tabel di bawah ini. |
| 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. |
| AS TYPE [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 dipanggil oleh pernyataan EXECUTE akan dikonversi ke dalam format seolah-olah dihasilkan oleh SELECT ... UNTUK XML ... Pernyataan. Semua pemformatan dari arahan 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. |
| Persyaratan | 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 setiap kolom. Jika jenis data berbeda, konversi implisit ke jenis data yang ditentukan dilakukan. Jika konversi gagal, batch dibatalkan |
| SUSUN collation_name | Kolabasi setiap kolom. Jika ada ketidakcocokan kolase, kolase implisit akan dicoba. Jika gagal, batch dibatalkan. |
| | NULL NOT NULL | Kemampuan null dari setiap kolom. Jika nullabilitas 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 klausa WITH RESULT SETS dengan salah satu cara berikut: jumlah kumpulan hasil, jumlah kolom, nama kolom, kemampuan null, dan jenis data. Jika jumlah tataan 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.
Bersarang terjadi ketika satu modul memanggil modul lain atau menjalankan kode terkelola dengan mereferensikan modul runtime bahasa umum (CLR), jenis yang ditentukan pengguna, atau agregat. Tingkat bersarang bertahakan ketika referensi modul atau kode terkelola yang dipanggil 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 bersarang 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.
SQL Server prosedur tersimpan sistem 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.
SQL Server prosedur tersimpan yang diperluas sistem 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 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 sebelumnya, string karakter dibatasi hingga 8.000 byte. Ini memerlukan penggandaan string besar untuk eksekusi dinamis. Dalam 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 AdventureWorks2012; 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 di 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 di 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 securables 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 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 SEBAGAI 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 sebagai EXECUTE AS user_name, dan user_name memiliki izin yang sesuai pada objek .
Izin Pengalihan Konteks
Untuk menentukan EXECUTE AS pada login, pemanggil harus memiliki izin IMPERSONATE pada nama login 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 AdventureWorks2012 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 prosedur tersimpan spGetWhereUsedProductID dalam database AdventureWorks2012. 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 dibuat secara dinamis yang berisi variabel. Contoh ini membuat tables_cursor kursor untuk menyimpan daftar semua tabel yang ditentukan pengguna dalam database AdventureWorks2012 , lalu menggunakan daftar tersebut 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 dan yang lebih baru
DECLARE @retstat INT;
EXECUTE @retstat = SQLSERVER1.AdventureWorks2012.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 yang ditautkan tersebut.
Berlaku untuk: SQL Server 2008 dan yang lebih baru
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
EXECUTE ( 'CREATE TABLE AdventureWorks2012.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 AdventureWorks2012. 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 yang ditautkan.
Berlaku untuk: SQL Server 2008 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 beralih 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. Contohnya membuat server SeattleSales tertaut yang menunjuk ke instans SELECT SQL Server lain dan menjalankan pernyataan terhadap server yang ditautkan tersebut. Pernyataan menggunakan SELECT tanda tanya sebagai tempat penampung untuk ProductID parameter (952), yang disediakan setelah pernyataan.
Berlaku untuk: SQL Server 2008 dan yang lebih baru
-- Setup the linked server.
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name
FROM AdventureWorks2012.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 AdventureWorks2012 membuat prosedur yang mengembalikan dua tataan hasil. Kemudian prosedur dijalankan menggunakan klausul 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 SQL Server Big Data Cluster. Contohnya membuat sumber SqlComputePool data terhadap kumpulan komputasi di SQL Server Kluster Big Data 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 SQL Server Big Data Cluster
Contoh berikut meneruskan string perintah ke sumber data eksternal yang menunjuk ke kumpulan komputasi di SQL Server kluster big data. Contohnya membuat sumber SqlDataPool data terhadap kumpulan data di SQL Server kluster big data 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 SQL Server Big Data Cluster
Contoh berikut meneruskan string perintah ke sumber data eksternal yang menunjuk ke kumpulan komputasi di SQL Server Big Data Cluster. Contohnya membuat sumber SqlStoragePool data terhadap kumpulan data di SQL Server Big Data Cluster 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 (SQL Bertransaksi)
DECLARE @local_variable (Transact-SQL)
Klausa EXECUTE AS (Transact-SQL)
Utilitas osql
Prinsipal (Mesin Database)
KEMBALI (SQL Bertransaksi)
sp_addlinkedserver (SQL Bertransaksi)
Utilitas sqlcmd
SUSER_NAME (SQL Bertransaksi)
sys.database_principals (SQL Bertransaksi)
sys.server_principals (SQL Bertransaksi)
USER_NAME (SQL Bertransaksi)
OPENDATASOURCE (transact-SQL)
Fungsi User-Defined Skalar untuk OLTP In-Memory
