Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Область применения: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';