Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения:SQL Server
В предыдущих версиях SQL Server обычно записывает хранимую процедуру (или расширенную хранимую процедуру), отправляющую результаты или выходные параметры вызывающему клиенту.
В хранимой процедуре Transact-SQL любая инструкция SELECT
, возвращающая нулю или больше строк, отправляет результаты в канал подключенного вызывающего абонента.
Для объектов базы данных среды CLR, работающих в SQL Server, можно отправлять результаты в подключенный канал с помощью методов Send
объекта SqlPipe
. Перейдите к свойству Pipe
объекта SqlContext
, чтобы получить объект SqlPipe
. Класс SqlPipe
концептуально похож на класс Response
, найденный в ASP.NET.
Дополнительные сведения см. в разделе Microsoft.SqlServer.Server.SqlPipe.
Возврат табличных результатов и сообщений
Объект SqlPipe
имеет метод Send
, имеющий три перегрузки. В их число входят:
void Send(string message)
void Send(SqlDataReader reader)
void Send(SqlDataRecord record)
Метод Send
отправляет данные непосредственно клиенту или вызывающему объекту. Обычно это клиент, который использует выходные данные из SqlPipe
, но с вложенными хранимыми процедурами CLR, выходной потребитель также может быть хранимой процедурой. Например, Procedure1
вызывает SqlCommand.ExecuteReader()
с текстом команды EXEC Procedure2
.
Procedure2
также является управляемой хранимой процедурой. Если Procedure2
теперь вызывает SqlPipe.Send(SqlDataRecord)
, строка отправляется читателю в Procedure1
, а не клиенту.
Метод Send
отправляет строковое сообщение, которое отображается на клиенте как информационное сообщение, эквивалентное PRINT
в Transact-SQL. Он также может отправлять результирующий набор с одной строкой с помощью SqlDataRecord
или многострочного результирующий набор с помощью SqlDataReader
.
Объект SqlPipe
также имеет метод ExecuteAndSend
. Этот метод можно использовать для выполнения команды (переданной как объект SqlCommand
) и отправки результатов непосредственно вызывающей стороне. Если в отправленной команде возникают ошибки, исключения отправляются в канал, а копия отправляется вызову управляемого кода. Если вызывающий код не перехватывает исключение, он распространяет стек на Transact-SQL код и отображается в выходных данных дважды. Если вызывающий код перехватывает исключение, потребитель канала по-прежнему видит ошибку, но не существует повторяющихся ошибок.
Он может принимать только SqlCommand
, связанный с подключением контекста; Не удается выполнить команду, связанную с подключением, не связанным с контекстным подключением.
Возврат пользовательских результирующих наборов
Управляемые хранимые процедуры могут отправлять результирующие наборы, не поступающие из SqlDataReader
. Метод SendResultsStart
вместе с SendResultsRow
и SendResultsEnd
позволяет хранимым процедурам отправлять пользовательские результирующие наборы клиенту.
SendResultsStart
принимает SqlDataRecord
в качестве входных данных. Он отмечает начало результирующего набора и при помощи метаданных записи составляет метаданные, описывающие результирующий набор. Он не отправляет значение записи с SendResultsStart
. Все последующие строки, отправленные с помощью SendResultsRow
, должны соответствовать определению метаданных.
После вызова метода SendResultsStart
можно вызывать только SendResultsRow
и SendResultsEnd
. Вызов любого другого метода в том же экземпляре SqlPipe
вызывает InvalidOperationException
.
SendResultsEnd
задает SqlPipe
обратно в исходное состояние, в котором можно вызывать другие методы.
Пример
Хранимая процедура uspGetProductLine
возвращает имя, номер продукта, цвет и цену списка всех продуктов в указанной строке продукта. Эта хранимая процедура принимает точные совпадения для prodLine
.
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.
}
}
}
};
Следующая инструкция Transact-SQL выполняет процедуру uspGetProduct
, которая возвращает список гастроловых продуктов велосипедов.
EXECUTE uspGetProductLineVB 'T';