Вернуть 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.