在存储过程中返回Bigint

时间:2014-09-18 14:36:54

标签: sql bigint enterprise-library-5

我有一个存储过程,必须返回bigint作为输出。如下定义。

在正文中,我在表中插入一行,并使用@@Identity输出变量中的@LogID返回标识。

除返回部分外,一切正常。我尝试过投射,转换,选择和设置@LogID@@identity,但没有运气。

存储过程由企业库的Logging块调用。我正在使用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 个答案:

答案 0 :(得分:3)

Stored procedures can only return int.所以你需要使用输出参数。

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

在上面的示例中,在执行该过程之后,@CapturedLogID将存储过程(@@identity)中设置的值存储起来,正如其他人所指出的那样,应该将其更改为scope_identity()立即)。


编辑:从C#,使用out参数调用该过程:

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 对象的代码。