2014-09-18 3 views
1

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

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

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

Сохраненный proc вызывается блоком регистрации в корпоративной библиотеке. Я использую метод 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 
+2

Не используйте здесь @@ IDENTITY. Вместо этого вы должны использовать SCOPE_IDENTITY. Если у вас есть триггер в вашей таблице журналов, который содержит вставку с столбцом идентификации, ваша процедура получит это значение. Что вы подразумеваете, возвратная часть не работает? Как вы это называете? –

+2

Я бы положил деньги на то, что забыл * также * включить ключевое слово 'OUTPUT' в том месте, где вы * вызываете * хранимую процедуру. Но вы не показали нам этот код. –

+0

@SeanLange Нет У меня нет триггера в таблице журналов. Этот код является частью моей реализации блока регистрации корпоративной библиотеки. Процедура WriteLog должна возвращать результат в соответствии с требованием Библиотеки. Моя база данных собирается пересечь предел столбца Int for LogID, и мне нужно изменить его на bigint для продолжения ведения журнала. Код работает, если вывод Int, но не тогда, когда Bigint –

ответ

2

Stored procedures can only return int. Таким образом, вам нужно будет использовать выходной параметр.

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

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


Edit: От 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 объекта.

+0

@LogID - выходной параметр –

+0

Я знаю. Вы объявляете переменную для захвата параметра, чтобы вы могли использовать его после вызова хранимой процедуры. Я отредактирую свой ответ и переименую переменную, чтобы сделать различие более очевидным. – md4

+0

Я вызываю SP из кода C# и не выполняю его, как вы показали. –