检查记录是不是存在,如果是,则“更新”,如果不“插入”
Posted
技术标签:
【中文标题】检查记录是不是存在,如果是,则“更新”,如果不“插入”【英文标题】:Check if record exists, if yes "update" if not "insert"检查记录是否存在,如果是,则“更新”,如果不“插入” 【发布时间】:2011-03-12 11:36:42 【问题描述】:我想检查表 PREMIUM_SERVICE_USER
是否存在任何记录
如果strClientID
没有记录插入到premium_service_user
表,则strClientID
更新timeValid
为+30。
我做错了什么?
它增加了timeValid
+30 天,但也插入了另一行。
SELECT @pre_var = count(*)
FROM PREMIUM_SERVICE_USER
WHERE strClientID = @strClientID
/* bronze premium - 200 cash */
IF @Premium = 1
BEGIN
INSERT INTO PREMIUM_SERVICE_USER
(strClientID, timeReg, timeValid, bCurrent, durum)
VALUES
(@strClientID,getdate(),getdate() + 30,'1','1')
UPDATE TB_USER
SET cash = cash+200
WHERE strAccountID = @strClientID
END
IF @Premium = 1 AND @pre_var = 1
BEGIN
UPDATE PREMIUM_SERVICE_USER
SET timevalid = timevalid+30 where strClientID = @strClientID
UPDATE PREMIUM_SERVICE_USER
SET bCurrent = 1 where strClientID = @strClientID
UPDATE TB_USER
SET cash = cash+200 WHERE strAccountID = @strClientID
END
【问题讨论】:
除了下面找到的修复之外,我还建议您将 UPDATE 语句合并到 PREMIUM_SERVICE_USER 的单个语句中 【参考方案1】:CREATE PROCEDURE sp_UpdateProcessed
AS
BEGIN
DECLARE @Processed_Status NVARCHAR(256)
SET @Processed_Status = 'ACTIVE'
IF(@Processed_Status <> 'Processed')
BEGIN
SET @Processed_Status = 'Active'
UPDATE ST_JnlMediumMoveNew
SET ST_JnlMediumMoveNew.Process_Status = @Processed_Status
END
END
【讨论】:
【参考方案2】:您在计算行数,但没有在您的决策中使用它。这是一个可能有用的决策结构
Select @pre_var = count(*) From PREMIUM_SERVICE_USER Where strClientID = @strClientID
IF @pre_var = 0
BEGIN
/* Run Insert Code Here */
END
ELSE
BEGIN
/* Run Update Code Here */
END
IF @Premium = 1
BEGIN
/* Run Premier Members Update Code Here */
END
ELSE
BEGIN
/* Run Non-Premier Members Update Code Here */
END
或者这个..
IF @pre_var = 0
BEGIN
/* Run Insert Code Here */
END
ELSE
BEGIN
IF @Premium = 1
BEGIN
/* Run Premier Members Update Code Here */
END
ELSE
BEGIN
/* Run Non-Premier Members Update Code Here */
END
END
【讨论】:
但如果 count 返回我 1 表示记录存在于表中。我想做的是如果表上存在行进行更新。你的建议不意味着如果 count 返回 0 会更新吗?【参考方案3】:看起来您在第一个 IF 语句中检查了错误的变量。如果@Premium = 1 那么你会看到这种行为。
/* bronze premium - 200 cash */
IF @pre_var = 0
BEGIN
INSERT INTO PREMIUM_SERVICE_USER (strClientID, timeReg, timeValid, bCurrent, durum) VALUES (@strClientID,getdate(),getdate() + 30,'1','1')
UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID
END
IF @Premium = 1 AND @pre_var = 1
BEGIN
update PREMIUM_SERVICE_USER set timevalid = timevalid+30 where strClientID = @strClientID
update PREMIUM_SERVICE_USER set bCurrent = 1 where strClientID = @strClientID
UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID
END
【讨论】:
【参考方案4】:您的问题是运行第一个 if
而不考虑 @pre_var
的值。
这是一种稍微不同的方法,如果PREMIUM_SERVICE_USER
很大,效率会稍微高一些。
if @Premium = 1
begin
if exists(Select 1 From PREMIUM_SERVICE_USER Where strClientID = @strClientID)
BEGIN
update PREMIUM_SERVICE_USER set timevalid = timevalid+30 where strClientID = @strClientID
update PREMIUM_SERVICE_USER set bCurrent = 1 where strClientID = @strClientID
UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID
END
ELSE
BEGIN
INSERT INTO PREMIUM_SERVICE_USER (strClientID, timeReg, timeValid, bCurrent, durum) VALUES (@strClientID,getdate(),getdate() + 30,'1','1')
UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID
END
end
【讨论】:
以上是关于检查记录是不是存在,如果是,则“更新”,如果不“插入”的主要内容,如果未能解决你的问题,请参考以下文章
检查模板中是不是存在变量,如果不存在则不会在记录器中导致错误
SQL Select:如果存在则更新,如果不存在则插入 - 使用日期部分比较?