Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Nelle versioni precedenti di SQL Server, è molto comune scrivere una stored procedure (o una stored procedure estesa) che invia i risultati o i parametri di output al client chiamante.
In una stored procedure Transact-SQL qualsiasi istruzione SELECT 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 metodi Send dell'oggetto SqlPipe. Accedere alla proprietà Pipe dell'oggetto SqlContext per ottenere l'oggetto SqlPipe. La classe SqlPipe è concettualmente simile alla classe Response disponibile in ASP.NET. Per altre informazioni, vedere la documentazione di riferimento sulla classe SqlPipe nel kit di sviluppo software .NET Framework.
Restituzione di messaggi e risultati tabulari
Ha SqlPipe un Send metodo, che dispone di tre overload. Sono:
void Send(string message)void Send(SqlDataReader reader)void Send(SqlDataRecord record)
Il metodo Send invia i dati direttamente al client o al chiamante. In genere è il client che utilizza l'output di SqlPipe, ma nel caso di stored procedure CLR nidificate, il consumer di output può anche essere una stored procedure. Ad esempio, Procedure1 chiama SqlCommand.ExecuteReader() con il testo del comando "EXEC Procedure2". Procedure2 è anche una stored procedure gestita. Se Procedure2 chiama ora SqlPipe.Send( SqlDataRecord ), la riga viene 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ò anche inviare un set di risultati a riga singola usando SqlDataRecordo un set di risultati su più righe usando un SqlDataReader.
L'oggetto SqlPipe dispone anche di un metodo ExecuteAndSend. Questo metodo può essere usato per eseguire un comando (passato come oggetto SqlCommand) e inviare i risultati direttamente al chiamante. Se sono presenti errori nel comando inviato, le eccezioni vengono inviate alla pipe, ma viene inviata anche una copia al codice gestito chiamante. Se il codice chiamante non rileva l'eccezione, propaga lo stack al codice Transact-SQL e viene visualizzato nell'output due volte. Se il codice chiamante intercetta l'eccezione, il consumer di pipe visualizza comunque l'errore, ma non è presente un errore duplicato.
Può accettare solo un SqlCommand oggetto associato alla connessione di contesto. Non può accettare un comando associato alla connessione non contestuale.
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 a SendResultsRow e SendResultsEnd, consente alle stored procedure di inviare set di risultati personalizzati al client.
SendResultsStart accetta un 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 usando SendResultsRow, devono corrispondere a tale definizione di metadati.
Annotazioni
Dopo aver chiamato solo SendResultsRow il SendResultsStart metodo e SendResultsEnd può essere chiamato. La chiamata di qualsiasi altro metodo nella stessa istanza di SqlPipe causa un InvalidOperationException.
SendResultsEnd imposta SqlPipe sullo stato iniziale in cui è possibile chiamare 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 all'interno di una linea di prodotto 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 procedura di uspGetProduct, che restituisce un elenco di prodotti per biciclette da turismo.
EXEC uspGetProductLineVB 'T';
Vedere anche
Oggetto SqlDataRecord
Procedure memorizzate CLR
SQL Server In-Process estensioni specifiche da ADO.NET