我刚刚继承了存储过程,作为插入新用户的系统的一部分
在顶部,@user_id
声明为INT OUTPUT
,底部为SET @user_id = @@IDENTITY
,由于某种原因,它始终返回零。如果我这样做:
select @@IDENTITY
......我得到的东西'1872040'
如果我这样做:
SET @user_id = 187300
......我明白了:
将数据类型int转换为smallint时出错
如果我这样做,我也会这样做:
SET @user_id = CAST(@@IDENITY as INT)...
它必须是SET @user_id = CAST(@@IDENITY as TINYINT)
或@user_id = @@IDENITY
,因为它不会给我错误。然而,它只返回null / 0.所以,我在谷歌上搜索并无法真正找到答案,是否有更好的方法来强制输出参数不是tinyint?这是在ms sql中。
答案 0 :(得分:3)
我已经复制了可能导致此问题的方案。我认为它可能不是sproc本身,而是你调用sproc的方式 - 具体来说,调用代码为@user_id指定了数据类型。
e.g。
DECLARE @user_id SMALLINT -- THIS IS WRONG, SHOULD BE INT
EXECUTE YourSproc 'ValueA', @user_id OUTPUT
一旦表上的IDENTITY值超过SMALLINT的容量,就会出现转换错误。
因此,请确保在调用代码中指定正确的数据类型。
另外,根据我的评论,您可能希望使用SCOPE_IDENTITY()而不是@@ IDENTITY。