Вернуть Bigint в хранимой процедуре

У меня есть хранимая процедура, которая должна вернуть bigint в качестве вывода. ниже, если определение.

В теле я вставляю строку в таблицу и возвращаю идентификатор, используя @@Identity в @LogID выходная переменная.

Все работает, кроме обратной части. Я пробовал кастовать, конвертировать, выбирать и настраивать @LogID в @@identity но не повезло.

Хранимая процедура вызывается блоком ведения журнала корпоративной библиотеки. я использую Write метод Logwriter учебный класс. Это стандартный класс, предоставляемый Microsoft, и мы не модифицировали его. Я не могу показать вам код, который вызывает процедуру, так как это DLL и не имеет исходного кода. Во всяком случае, я уверен, что это не код C#, как я получаю SQLException так что-то в sql. Код ниже для краткости, и есть много других столбцов, которые я удалил. Все они представлены в качестве входных параметров.

Я уверен, что это глупость, но я как-то скучаю по ней.

CREATE PROCEDURE [dbo].[WriteLog]
(
    @EventID int, 
    @Priority int, 
    @LogId bigint OUTPUT
)
    INSERT INTO [Log] (EventID, Priority) 
    VALUES(@EventID,@Priority)

    SET @LogID = @@identity
Go

1 ответ

Решение

Хранимые процедуры можно вернуть только int , Так что вам нужно будет использовать выходной параметр.

declare @CapturedLogID bigint;
exec dbo.WriteLog @EventID = 42, @Priority = 1337, @LogID = @CapturedLogID output;

В приведенном выше примере после выполнения процедуры @CapturedLogID сохраняет значение, установленное в хранимой процедуре (@@identity который, как указали другие, должен быть изменен на scope_identity() немедленно).


Изменить: из C#, чтобы вызвать процедуру с выходным параметром:

using (var cmd = new SqlCommand()) {
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "dbo.WriteLog";
    cmd.Parameters.Add("EventID", SqlDbType.Int).Value = 42;
    cmd.Parameters.Add("Priority", SqlDbType.Int).Value = 1337;
    cmd.Parameters.Add("LogID", SqlDbType.BigInt).Direction = ParameterDirection.Output;
    cmd.ExecuteNonQuery();

    long logID = (long)cmd.Parameters["LogID"].Value;
}

Обратите внимание, что я включил только код для настройки и выполнения объекта SqlCommand.

Другие вопросы по тегам