Если у меня есть хранимая процедура, как это:Возвращение ROWCOUNT из CLR хранимой процедуры
CREATE PROCEDURE [dbo].[sp_update_dummy]
AS
BEGIN
update update_dummy set value = value + 1 where id = 1
END
и вызвать используя executeUpdate
(из стандартной библиотеки java.sql) обновленное количество строк возвращается в программу Java (предполагая, конечно, что оператор обновления обновляет строку в таблице).
Однако если выполнить процедуру CLR хранится закодированной так:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void clr_update_dummy()
{
using (SqlConnection conn = new SqlConnection("context connection=true"))
{
SqlCommand command = new SqlCommand("update update_dummy set value = value + 1 where id = 1", conn);
conn.Open();
command.ExecuteNonQuery();
conn.Close();
}
}
Затем программа Java не получает обновленное количество строк (это, кажется, чтобы получить значение от -1 возвращается). Это также происходит, если я положил SET NOCOUNT ON
в хранимую процедуру SQL.
Поэтому мне кажется, что хранимая процедура CLR действует так, как если бы использовался SET NOCOUNT ON
.
Есть ли способ закодировать хранимую процедуру CLR, чтобы подсчет строк мог быть получен таким же образом, как и для хранимой процедуры SQL? К сожалению, невозможно изменить программу Java (это сторонний компонент), чтобы, например, выбрать параметр OUTPUT. Я посмотрел на SqlContext.Pipe, но там нет ничего очевидного. Также я не уверен в механизме, с помощью которого счетчик строк возвращается в процедуру executeUpdate.
Возможно, я могу создать хак, чтобы обойти проблему (Java выполняет хранимую процедуру SQL, которая, в свою очередь, выполняет хранимую процедуру CLR, например), но, если возможно, я бы не хотел вводить другой слой в стек вызовов.
Side Примечание: Вы не должны использовать 'sp_' префикса для сохраненных имен процедур - это зарезервировано для системных процедур Microsoft. –
@Damien_The_Unbeliever - Я знаю об этом, я выбрал это имя неразумно. –
Вам нужно использовать CLR? Это просто избежать использования SQL? – gbn