Oggetto SqlPipe
Nelle versioni precedenti di SQL Server, è molto comune scrivere una stored procedure (o una stored procedure estesa) che invia i risultati o parametri di output al client chiamante.
In una stored procedure Transact-SQL, qualsiasi SELECT
istruzione che restituisce zero o più righe invia i risultati alla "pipe" del chiamante connesso.
Per gli oggetti di database CLR (Common Language Runtime) in esecuzione in SQL Server, è possibile inviare risultati alla pipe connessa usando i Send
metodi dell'oggettoSqlPipe
. Accedere alla proprietà Pipe
dell'oggetto SqlContext
per ottenere l'oggetto SqlPipe
. Concettualmente la classe SqlPipe
è simile alla classe Response
di ASP.NET. Per ulteriori informazioni, vedere documentazione di riferimento per la classe SqlPipe in .NET Framework SDK (Software Development Kit).
Restituzione di risultati tabulari e messaggi
L'oggetto SqlPipe
dispone di un metodo Send
che presenta tre overload, ovvero:
void Send(string message)
void Send(SqlDataReader reader)
void Send(SqlDataRecord record)
Il metodo Send
invia dati direttamente al client o al chiamante. In genere è il client che utilizza l'output proveniente dal metodo SqlPipe
, ma nel caso di stored procedure CLR nidificate il consumer dell'output può anche essere una stored procedure. Procedure1 chiama ad esempio SqlCommand.ExecuteReader() con il testo del comando "EXEC Procedure2". Procedure2 è anche una stored procedure gestita. Se Procedure2 chiama il metodo SqlPipe.Send(SqlDataRecord), la riga verrà inviata al lettore di Procedure1, non al client.
Il Send
metodo invia un messaggio stringa visualizzato nel client come messaggio informativo, equivalente a PRINT in Transact-SQL. Può inoltre inviare un set di risultati a riga singola utilizzando SqlDataRecord
o un set di risultati a più righe utilizzando SqlDataReader
.
L'oggetto SqlPipe
include inoltre un metodo ExecuteAndSend
. Questo metodo può essere utilizzato per eseguire un comando (passato come oggetto SqlCommand
) e per restituire i risultati direttamente al chiamante. Se sono presenti errori nel comando inviato, le eccezioni vengono inviate alla pipe, ma una copia viene inviata anche al codice gestito chiamante. Se il codice chiamante non rileva l'eccezione, propaga lo stack al codice Transact-SQL e viene visualizzato due volte nell'output. Se il codice chiamante rileva l'eccezione, il consumer della pipe visualizzerà l'errore, ma questo non verrà duplicato.
Il metodo può utilizzare solo un comando SqlCommand
associato alla connessione con contesto e non un comando associato alla connessione senza contesto.
Restituzione di set di risultati personalizzati
Le stored procedure gestite possono inviare set di risultati che non provengono da un oggetto SqlDataReader
. Il metodo SendResultsStart
, insieme ai metodi SendResultsRow
e SendResultsEnd
, consente alle stored procedure di inviare set di risultati personalizzati al client.
SendResultsStart
utilizza un oggetto SqlDataRecord
come input. Indica l'inizio di un set di risultati e utilizza i metadati del record per costruire i metadati che descrivono il set in questione. Non invia il valore del record con SendResultsStart
. Tutte le righe successive, inviate mediante il metodo SendResultsRow
, dovranno corrispondere alla specifica definizione dei metadati.
Nota
Dopo la chiamata al metodo SendResultsStart
, è possibile chiamare solo SendResultsRow
e SendResultsEnd
. La chiamata di qualsiasi altro metodo nella stessa istanza di SqlPipe
provoca una InvalidOperationException
. SendResultsEnd
imposta SqlPipe
di nuovo nello stato iniziale nel quale possono essere chiamati gli altri metodi.
Esempio
La stored procedure uspGetProductLine
restituisce il nome, il numero di prodotto, il colore e il prezzo di listino di tutti i prodotti di una linea dei prodotti specificata. Questa stored procedure accetta corrispondenze esatte per 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
L'istruzione Transact-SQL seguente esegue la uspGetProduct
procedura, che restituisce un elenco di prodotti per biciclette touring.
EXEC uspGetProductLineVB 'T';
Vedere anche
Oggetto SqlDataRecord
Stored procedure CLR
Estensioni specifiche in-process di SQL Server ad ADO.NET