我有一个存储过程,必须返回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
答案 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 对象的代码。