Sql 存储过程不插入数据
我对SQL Server存储过程非常感兴趣,它应该将用户注册到数据库中(如果用户还不存在)。但是,在成功执行该过程后,没有数据插入到Sql 存储过程不插入数据,sql,sql-server,stored-procedures,sql-insert,Sql,Sql Server,Stored Procedures,Sql Insert,我对SQL Server存储过程非常感兴趣,它应该将用户注册到数据库中(如果用户还不存在)。但是,在成功执行该过程后,没有数据插入到Users表中 如果我直接运行insert语句,它就会工作 下面是完整的程序代码,在你问我之前,数据库是空的 --USERS CREATE PROCEDURE [dbo].[RegisterUser] @NAME VARCHAR(255), @PHONENUMBER VARCHAR(255), @STATUS INT OUT, @REMAININGD
Users
表中
如果我直接运行insert语句,它就会工作
下面是完整的程序代码,在你问我之前,数据库是空的
--USERS
CREATE PROCEDURE [dbo].[RegisterUser]
@NAME VARCHAR(255),
@PHONENUMBER VARCHAR(255),
@STATUS INT OUT,
@REMAININGDAYS INT OUT
AS
BEGIN
SET NOCOUNT ON;
UPDATE Users WITH (serializable)
SET Name = @NAME
WHERE PhoneNumber LIKE @PHONENUMBER
SET @REMAININGDAYS = 0
IF @@rowcount = 0
BEGIN
INSERT INTO Users (Name, PhoneNumber, RegisterDate)
VALUES (@NAME, @PHONENUMBER, GETDATE())
SET @STATUS = 0
SET @REMAININGDAYS = 40
END
ELSE
BEGIN
DECLARE @USERID BIGINT
DECLARE @EXP DATETIME
SELECT TOP 1
@USERID = USERID
FROM USERS
WHERE PhoneNumber LIKE @PHONENUMBER
SELECT TOP 1
@EXP = DATEADD(day, DAYS, REGISTERDATE)
FROM SUBSCRIPTIONS
WHERE USERID = @USERID
ORDER BY [REGISTERDATE]
IF @EXP IS NULL
BEGIN
SELECT TOP 1
@EXP = DATEADD(day, 40, REGISTERDATE)
FROM USERS
WHERE USERID = @USERID
IF GETDATE() < @EXP
BEGIN
SET @STATUS = 0
SET @REMAININGDAYS = DATEDIFF(day, GETDATE(), @EXP)
END
ELSE
BEGIN
SET @STATUS = -1
END
END
ELSE
BEGIN
IF GETDATE() < @EXP
SET @STATUS = 1
ELSE
SET @STATUS = -1
END
END
END
——用户
创建过程[dbo]。[RegisterUser]
@名称VARCHAR(255),
@电话号码VARCHAR(255),
@状态INT OUT,
@剩余天数
作为
开始
不计数;
使用(可序列化)更新用户
SET Name=@Name
其中PhoneNumber类似于@PhoneNumber
设置@REMAININGDAYS=0
如果@@rowcount=0
开始
插入用户(姓名、电话号码、注册日期)
值(@NAME、@PHONENUMBER、GETDATE())
设置@STATUS=0
设置@REMAININGDAYS=40
结束
其他的
开始
声明@USERID BIGINT
声明@EXP DATETIME
选择前1名
@USERID=USERID
来自用户
其中PhoneNumber类似于@PhoneNumber
选择前1名
@EXP=DATEADD(天,天,注册日期)
来自订阅
其中USERID=@USERID
由[注册日期]发出的命令
如果@EXP为空
开始
选择前1名
@EXP=日期添加(第40天,注册日期)
来自用户
其中USERID=@USERID
如果GETDATE()<@EXP
开始
设置@STATUS=0
设置@REMAININGDAYS=DATEDIFF(day,GETDATE(),@EXP)
结束
其他的
开始
设置@STATUS=-1
结束
结束
其他的
开始
如果GETDATE()<@EXP
设置@STATUS=1
其他的
设置@STATUS=-1
结束
结束
结束
我称之为传递所有参数
谢谢大家! 进行简单赋值的语句总是将@ROWCOUNT值设置为1
所以
打印1
DECLARE @RC INT
UPDATE Users WITH (serializable) SET Name = @NAME
WHERE PhoneNumber LIKE @PHONENUMBER
SET @RC = @@ROWCOUNT
SET @REMAININGDAYS = 0
IF @@RC = 0
BEGIN
INSERT INTO Users <etc...>
DECLARE@RC INT
使用(可序列化)SET Name=@Name更新用户
其中PhoneNumber类似于@PhoneNumber
设置@RC=@@ROWCOUNT
设置@REMAININGDAYS=0
如果@RC=0
开始
插入到用户中
或者在update语句上方移动SET@REMAININGDAYS=0
,这样在update和测试@@ROWCOUNT
进行简单赋值的语句之间就不会有任何内容始终将@ROWCOUNT值设置为1
所以
打印1
DECLARE @RC INT
UPDATE Users WITH (serializable) SET Name = @NAME
WHERE PhoneNumber LIKE @PHONENUMBER
SET @RC = @@ROWCOUNT
SET @REMAININGDAYS = 0
IF @@RC = 0
BEGIN
INSERT INTO Users <etc...>
DECLARE@RC INT
使用(可序列化)SET Name=@Name更新用户
其中PhoneNumber类似于@PhoneNumber
设置@RC=@@ROWCOUNT
设置@REMAININGDAYS=0
如果@RC=0
开始
插入到用户中
或者将
SET@REMAININGDAYS=0
移到update语句上方,这样更新和测试@@ROWCOUNT
之间就没有什么效果了!非常感谢你!工作得很好!非常感谢你!