Bagikan melalui


JALANKAN (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Titik akhir analitik SQL di Microsoft FabricGudang di Microsoft FabricDatabase 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.

Konvensi sintaks transact-SQL

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 , yang 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 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. @string_variable dapat berupakarakter , varchar, nchar, atau jenis data nvarchar . Ini termasuk jenis data (maks).

[N]'tsql_string'

String konstanta. tsql_string dapat berupa jenis data nvarchar atau varchar apa pun. Jika disertakan, string ditafsirkan sebagai jenis data nvarchar .

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 harus merupakan anggota peran server tetap sysadmin atau ada sebagai prinsipal dalam sys.database_principals atau sys.server_principals, masing-masing.

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 disertakan, string ditafsirkan sebagai jenis data nvarchar .

[?]

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 SETS tidak dapat ditentukan dalam pernyataan INSERT...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 SETS tidak dapat ditentukan dalam pernyataan INSERT...EXECUTE.

    Term Definition
    RECOMPILE Memaksa 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 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.
    RESULT SETS UNDEFINED Opsi 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 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.

    Berlaku untuk: SQL Server 2012 (11.x) dan versi yang lebih baru, dan Azure SQL Database.
    RESULT SETS NONE Menjamin bahwa pernyataan EXECUTE tidak 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. Klausa result_sets_definition memiliki 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 EXECUTE dikonversi ke dalam format seolah-olah dihasilkan oleh pernyataan SELECT ... 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 XML tidak 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 NULL dan data yang dikembalikan berisi null, kesalahan terjadi 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.

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 dalamResource Database , 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

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\SQLUsers memiliki akses ke database Sales.

  • CompanyDomain\SqlUser1 adalah anggota SQLUsers dan, oleh karena itu, memiliki akses implisit ke database Sales.

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 USER atau EXECUTE 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 () dan parameter kedua adalah nilai tanggalwaktu .

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