好像还是同时执行的。
存储过程如下,真实奇怪死了ALTER PROC [dbo].[addUser]
(
@qqOpenID CHAR(32),
@userName NVARCHAR(30),
@qqImg VARCHAR(150),
@rankType TINYINT,
@sex TINYINT,
@insertGuidKey CHAR(36),
@wbName VARCHAR(50),
@id INT OUT,
@introduction NVARCHAR(500)
)
AS
SELECT @id=ID FROM Users WHERE qqOpenID=@qqOpenID
IF(@@ROWCOUNT>0)
BEGIN
UPDATE Users SET guidKey=@insertGuidKey,wbName=@wbName WHERE ID=@id
RETURN 65;
END
ELSE
BEGIN
INSERT Users(qqOpenID,userName,qqImg,rankType,sex,guidKey,wbName,typeid,introduction) VALUES(@qqOpenID,@userName,@qqImg,@rankType,@sex,@insertGuidKey,@wbName,1,@introduction)
Select @id=SCOPE_IDENTITY()
RETURN 66;
END

解决方案 »

  1.   

    1、首先,你的代码可以改进,如果使用2008以后的数据库,可以使用merge关键字,把update和insert合到一句中,这样可以减少if/else。
    2、纯属个人猜测,会不会是你的数据量比较大,然后执行的时候阻塞比较严重,没有控制好锁,导致你的代码运行时会出现别的事务(或者是连接)也执行了一次,你看到的结果就成了两次。
      

  2.   

    那可能要检查一下那台执行两次的机器,是否有什么不同。你可以试试用那台电脑来跟踪究竟它是怎么执行存储过程,就是SSMS那个执行旁边的小绿箭头。看看过程。或者用VS写个代码来调用跟踪,vs很久没用,不会写。
    另外,哪怕数据只有1条,也有可能受别的事务影响而导致查不出来。