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.
Dalam versi SQL Server sebelumnya, sangat umum untuk menulis prosedur tersimpan (atau prosedur tersimpan yang diperluas) yang mengirim parameter hasil atau output ke klien panggilan.
Dalam prosedur tersimpan Transact-SQL, pernyataan SELECT apa pun yang mengembalikan nol atau lebih baris mengirimkan hasilnya ke "pipa" pemanggil yang terhubung.
Untuk objek database runtime bahasa umum (CLR) yang berjalan di SQL Server, Anda dapat mengirim hasil ke pipa yang tersambung menggunakan metode Send objek SqlPipe. Akses properti Pipe objek SqlContext untuk mendapatkan objek SqlPipe. Kelas SqlPipe secara konseptual mirip dengan kelas Response yang ditemukan di ASP.NET. Untuk informasi selengkapnya, lihat dokumentasi referensi Kelas SqlPipe di kit pengembangan perangkat lunak .NET Framework.
Mengembalikan Hasil dan Pesan Tabular
memiliki SqlPipeSend metode , yang memiliki tiga kelebihan beban. Mereka adalah:
void Send(string message)void Send(SqlDataReader reader)void Send(SqlDataRecord record)
Metode Send mengirim data langsung ke klien atau pemanggil. Biasanya klien yang menggunakan output dari SqlPipe, tetapi dalam kasus prosedur tersimpan CLR berlapis, konsumen output juga dapat menjadi prosedur tersimpan. Misalnya, Procedure1 memanggil SqlCommand.ExecuteReader() dengan teks perintah "EXEC Procedure2". Prosedur2 juga merupakan prosedur tersimpan terkelola. Jika Procedure2 sekarang memanggil SqlPipe.Send( SqlDataRecord ), baris dikirim ke pembaca Procedure1, bukan klien.
Metode mengirim Send pesan string yang muncul pada klien sebagai pesan informasi, setara dengan PRINT di Transact-SQL. Ini juga dapat mengirim tataan hasil baris tunggal menggunakan SqlDataRecord, atau tataan hasil multi-baris menggunakan SqlDataReader.
Objek SqlPipe juga memiliki metode ExecuteAndSend. Metode ini dapat digunakan untuk menjalankan perintah (diteruskan sebagai objek SqlCommand) dan mengirim hasil langsung kembali ke pemanggil. Jika ada kesalahan dalam perintah yang dikirimkan, pengecualian dikirim ke pipa, tetapi salinan juga dikirim ke memanggil kode terkelola. Jika kode panggilan tidak menangkap pengecualian, kode tersebut menyebarkan tumpukan ke kode Transact-SQL dan muncul dalam output dua kali. Jika kode panggilan menangkap pengecualian, konsumen pipa masih melihat kesalahan, tetapi tidak ada kesalahan duplikat.
Ini hanya dapat mengambil SqlCommand yang terkait dengan koneksi konteks; tidak dapat mengambil perintah yang terkait dengan koneksi non-konteks.
Mengembalikan Kumpulan Hasil Kustom
Prosedur tersimpan terkelola dapat mengirim kumpulan hasil yang tidak berasal dari SqlDataReader. Metode SendResultsStart, bersama dengan SendResultsRow dan SendResultsEnd, memungkinkan prosedur tersimpan untuk mengirim kumpulan hasil kustom ke klien.
SendResultsStart mengambil SqlDataRecord sebagai input. Ini menandai awal kumpulan hasil dan menggunakan metadata rekaman untuk membuat metadata yang menjelaskan kumpulan hasil. Ini tidak mengirim nilai rekaman dengan SendResultsStart. Semua baris berikutnya, yang dikirim menggunakan SendResultsRow, harus cocok dengan definisi metadata tersebut.
Nota
Setelah memanggil SendResultsStart metode hanya SendResultsRow dan SendResultsEnd dapat dipanggil. Memanggil metode lain dalam instans SqlPipe yang sama menyebabkan InvalidOperationException.
SendResultsEnd mengatur SqlPipe kembali ke status awal di mana metode lain dapat dipanggil.
Contoh
Prosedur tersimpan uspGetProductLine mengembalikan nama, nomor produk, warna, dan daftar harga semua produk dalam baris produk tertentu. Prosedur tersimpan ini menerima kecocokan yang tepat untuk prodLine.
C#
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void uspGetProductLine(SqlString prodLine)
{
// Connect through the context connection.
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
SqlCommand command = new SqlCommand(
"SELECT Name, ProductNumber, Color, ListPrice " +
"FROM Production.Product " +
"WHERE ProductLine = @prodLine;", connection);
command.Parameters.AddWithValue("@prodLine", prodLine);
try
{
// Execute the command and send the results to the caller.
SqlContext.Pipe.ExecuteAndSend(command);
}
catch (System.Data.SqlClient.SqlException ex)
{
// An error occurred executing the SQL command.
}
}
}
};
Visual Basic
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Partial Public Class StoredProcedures
<Microsoft.SqlServer.Server.SqlProcedure()> _
Public Shared Sub uspGetProductLine(ByVal prodLine As SqlString)
Dim command As SqlCommand
' Connect through the context connection.
Using connection As New SqlConnection("context connection=true")
connection.Open()
command = New SqlCommand( _
"SELECT Name, ProductNumber, Color, ListPrice " & _
"FROM Production.Product " & _
"WHERE ProductLine = @prodLine;", connection)
command.Parameters.AddWithValue("@prodLine", prodLine)
Try
' Execute the command and send the results
' directly to the caller.
SqlContext.Pipe.ExecuteAndSend(command)
Catch ex As System.Data.SqlClient.SqlException
' An error occurred executing the SQL command.
End Try
End Using
End Sub
End Class
Pernyataan Transact-SQL berikut menjalankan prosedur uspGetProduct, yang mengembalikan daftar produk sepeda tur.
EXEC uspGetProductLineVB 'T';
Lihat Juga
Objek SqlDataRecord
Prosedur Tersimpan CLR
Ekstensi Khusus In-Process SQL Server untuk ADO.NET