Prosedur Tersimpan - Memanggil di SQL Server Native Client

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Penting

SQL Server Native Client (sering disingkat SNAC) telah dihapus dari SQL Server 2022 (16.x) dan SQL Server Management Studio 19 (SSMS). Penyedia SQL Server Native Client OLE DB (SQLNCLI atau SQLNCLI11) dan Penyedia Microsoft OLE DB warisan untuk SQL Server (SQLOLEDB) tidak direkomendasikan untuk pengembangan baru. Beralih ke Microsoft OLE DB Driver (MSOLEDBSQL) baru untuk SQL Server ke depannya.

Prosedur tersimpan dapat memiliki parameter nol atau lebih. Ini juga dapat mengembalikan nilai. Saat menggunakan penyedia SQL Server Native Client OLE DB, parameter ke prosedur tersimpan dapat diteruskan oleh:

  • Pengkodean keras nilai data.

  • Menggunakan penanda parameter (?) untuk menentukan parameter, mengikat variabel program ke penanda parameter, lalu menempatkan nilai data dalam variabel program.

Catatan

Saat memanggil prosedur tersimpan SQL Server menggunakan parameter bernama dengan OLE DB, nama parameter harus dimulai dengan karakter '@'. Ini adalah pembatasan khusus SQL Server. Penyedia SQL Server Native Client OLE DB memberlakukan pembatasan ini lebih ketat daripada MDAC.

Untuk mendukung parameter, antarmuka ICommandWithParameters diekspos pada objek perintah. Untuk menggunakan parameter, konsumen terlebih dahulu menjelaskan parameter ke penyedia dengan memanggil metode ICommandWithParameters::SetParameterInfo (atau secara opsional menyiapkan pernyataan panggilan yang memanggil metode GetParameterInfo ). Konsumen kemudian membuat aksesor yang menentukan struktur buffer dan menempatkan nilai parameter dalam buffer ini. Akhirnya, ia meneruskan handel aksesor dan penunjuk ke buffer ke Jalankan. Pada panggilan selanjutnya ke Jalankan, konsumen menempatkan nilai parameter baru di buffer dan memanggil Jalankan dengan handel aksesor dan penunjuk buffer.

Perintah yang memanggil prosedur tersimpan sementara menggunakan parameter harus terlebih dahulu memanggil ICommandWithParameters::SetParameterInfo untuk menentukan informasi parameter, sebelum perintah dapat berhasil disiapkan. Ini karena nama internal untuk prosedur tersimpan sementara berbeda dari nama eksternal yang digunakan oleh klien dan SQLOLEDB tidak dapat meminta tabel sistem untuk menentukan informasi parameter untuk prosedur tersimpan sementara.

Ini adalah langkah-langkah dalam proses pengikatan parameter:

  1. Isi informasi parameter dalam array struktur DBPARAMBINDINFO; yaitu, nama parameter, nama khusus penyedia untuk jenis data parameter atau nama jenis data standar, dan sebagainya. Setiap struktur dalam array menjelaskan satu parameter. Array ini kemudian diteruskan ke metode SetParameterInfo .

  2. Panggil metode ICommandWithParameters::SetParameterInfo untuk menjelaskan parameter ke penyedia. SetParameterInfo menentukan jenis data asli dari setiap parameter. Argumen SetParameterInfo adalah:

    • Jumlah parameter untuk mengatur informasi jenis.

    • Array ordinal parameter untuk mengatur informasi jenis.

    • Array struktur DBPARAMBINDINFO.

  3. Buat aksesor parameter dengan menggunakan perintah IAccessor::CreateAccessor . Aksesor menentukan struktur buffer dan menempatkan nilai parameter dalam buffer. Perintah CreateAccessor membuat aksesor dari sekumpulan pengikatan. Pengikatan ini dijelaskan oleh konsumen dengan menggunakan array struktur DBBINDING. Setiap pengikatan mengaitkan satu parameter ke buffer konsumen dan berisi informasi seperti:

    • Ordinal parameter tempat pengikatan berlaku.

    • Apa yang terikat (nilai data, panjangnya, dan statusnya).

    • Offset dalam buffer ke masing-masing bagian ini.

    • Panjang dan jenis nilai data seperti yang ada di buffer konsumen.

    Aksesor diidentifikasi oleh handelnya, yang berjenis HACCESSOR. Handel ini dikembalikan oleh metode CreateAccessor . Setiap kali konsumen selesai menggunakan aksesor, konsumen harus memanggil metode ReleaseAccessor untuk merilis memori yang dipegangnya.

    Ketika konsumen memanggil metode, seperti ICommand::Execute, ia meneruskan handel ke aksesor dan pointer ke buffer itu sendiri. Penyedia menggunakan aksesor ini untuk menentukan cara mentransfer data yang terkandung dalam buffer.

  4. Isi struktur DBPARAMS. Variabel konsumen tempat nilai parameter input diambil dan nilai parameter output mana yang ditulis diteruskan pada waktu proses ke ICommand::Execute dalam struktur DBPARAMS. Struktur DBPARAMS mencakup tiga elemen:

    • Penunjuk ke buffer tempat penyedia mengambil data parameter input dan tempat penyedia mengembalikan data parameter output, sesuai dengan pengikatan yang ditentukan oleh handel aksesor.

    • Jumlah set parameter dalam buffer.

    • Handel aksesor dibuat di Langkah 3.

  5. Jalankan perintah dengan menggunakan ICommand::Execute.

Metode Memanggil Prosedur Tersimpan

Saat menjalankan prosedur tersimpan di SQL Server, penyedia SQL Server Native Client OLE DB mendukung:

  • Urutan escape ODBC CALL.

  • Urutan escape panggilan prosedur jarak jauh (RPC).

  • Pernyataan TRANSACT-SQL EXECUTE.

Urutan Escape ODBC CALL

Jika Anda mengetahui informasi parameter, panggil metode ICommandWithParameters::SetParameterInfo untuk menjelaskan parameter kepada penyedia. Jika tidak, ketika sintaks ODBC CALL digunakan dalam memanggil prosedur tersimpan, penyedia memanggil fungsi pembantu untuk menemukan informasi parameter prosedur tersimpan.

Jika Anda tidak yakin tentang informasi parameter (metadata parameter), sintaks ODBC CALL disarankan.

Sintaks umum untuk memanggil prosedur dengan menggunakan urutan escape ODBC CALL adalah:

{[?=]callprocedure_name[([parameter][,[parameter]]...)]}

Contohnya:

{call SalesByCategory('Produce', '1995')}  

Urutan Lolos RPC

Urutan escape RPC mirip dengan sintaks ODBC CALL untuk memanggil prosedur tersimpan. Jika Anda akan memanggil prosedur beberapa kali, urutan escape RPC memberikan performa paling optimal di antara tiga metode panggilan prosedur tersimpan.

Ketika urutan escape RPC digunakan untuk menjalankan prosedur tersimpan, penyedia tidak memanggil fungsi pembantu apa pun untuk menentukan informasi parameter (seperti yang terjadi dalam kasus sintaks ODBC CALL). Sintaks RPC lebih sederhana daripada sintaks ODBC CALL, sehingga perintah diurai lebih cepat, meningkatkan performa. Dalam hal ini, Anda perlu memberikan informasi parameter dengan menjalankan ICommandWithParameters::SetParameterInfo.

Urutan escape RPC mengharuskan Anda memiliki nilai pengembalian. Jika prosedur tersimpan tidak mengembalikan nilai, server mengembalikan 0 secara default. Selain itu, Anda tidak dapat membuka kursor SQL Server pada prosedur tersimpan. Prosedur tersimpan disiapkan secara implisit dan panggilan ke ICommandPrepare::P repare akan gagal. Karena ketidakmampuan untuk menyiapkan panggilan RPC, Anda tidak dapat mengkueri metadata kolom; IColumnsInfo::GetColumnInfo dan IColumnsRowset::GetColumnsRowset akan mengembalikan DB_E_NOTPREPARED.

Jika Anda mengetahui semua metadata parameter, urutan escape RPC adalah cara yang disarankan untuk menjalankan prosedur tersimpan.

Ini adalah contoh urutan escape RPC untuk memanggil prosedur tersimpan:

{rpc SalesByCategory}  

Untuk aplikasi sampel yang menunjukkan urutan escape RPC, lihat Menjalankan Prosedur Tersimpan (Menggunakan Sintaks RPC) dan Kode Pengembalian Proses dan Parameter Output (OLE DB).

Pernyataan TRANSACT-SQL EXECUTE

Urutan escape ODBC CALL dan urutan escape RPC adalah metode pilihan untuk memanggil prosedur tersimpan daripada pernyataan EXECUTE . Penyedia SQL Server Native Client OLE DB menggunakan mekanisme RPC SQL Server untuk mengoptimalkan pemrosesan perintah. Protokol RPC ini meningkatkan performa dengan menghilangkan banyak pemrosesan parameter dan penguraian pernyataan yang dilakukan pada server.

Ini adalah contoh pernyataan Transact-SQL EXECUTE :

EXECUTE SalesByCategory 'Produce', '1995'  

Lihat Juga

Prosedur Tersimpan