【问题标题】:SQL query for update and insert data in table用于在表中更新和插入数据的 SQL 查询
【发布时间】:2015-09-08 08:00:55
【问题描述】:

我正在尝试更新我的表,我想在它什么都不做之前检查是否有记录,如果它不同,它会更改它,如果它不存在插入新的,这是我的表字段:

id  res-id   req-id   IsActive
--  ------   ------   --------

这是我的存储过程:

@Res_id int,
@Opt_id int,
@IsActive int
AS 
SET NOCOUNT ON 
SET XACT_ABORT ON  

BEGIN
IF EXISTS (SELECT * FROM [dbo].[res_opt_junc]
            WHERE [Res_id]=@Res_id AND [Opt_id]=@Opt_id AND [IsActive]=1 AND          @IsActive=1)
        BEGIN
        RETURN;
        END; 

ELSE IF EXISTS (SELECT * FROM [dbo].[res_opt_junc] 
            WHERE [Res_id]=@Res_id AND [Opt_id]=@Opt_id AND [IsActive]=0 AND @IsActive=1)
        BEGIN
            UPDATE [dbo].[res_opt_junc]
            SET    [Res_id] = @Res_id, [Opt_id] = @Opt_id, [IsActive] = @IsActive
            WHERE  [Res_id]=@Res_id AND [Opt_id]=@Opt_id AND [IsActive]=0 AND @IsActive=1           
        RETURN;
        END;
ELSE IF EXISTS (SELECT * FROM [dbo].[res_opt_junc] 
            WHERE [Res_id]=@Res_id AND [Opt_id]=@Opt_id AND [IsActive]=1 AND @IsActive=0)
        BEGIN
            UPDATE [dbo].[res_opt_junc]
            SET    [Res_id] = @Res_id, [Opt_id] = @Opt_id, [IsActive] = @IsActive
            WHERE  [Res_id]=@Res_id AND [Opt_id]=@Opt_id AND [IsActive]=1 AND @IsActive=0
            RETURN;
        END;
ELSE IF NOT EXISTS (SELECT * FROM [dbo].[res_opt_junc]
            WHERE [Res_id]=@Res_id AND [Opt_id]=@Opt_id)
        BEGIN
            INSERT INTO [dbo].[res_opt_junc] ([Res_id],[Opt_id],[IsActive])
            VALUES (@Res_id , @Opt_id  , @IsActive);
            RETURN;
        END;
END

我不知道为什么我的表中的数据重复了;

【问题讨论】:

  • 什么版本的sql-server?你可以试试MERGE
  • 如果你有重复,你错过了一个独特的约束。
  • Merge query in SQL Server 2008 的可能重复项

标签: sql sql-server


【解决方案1】:

MERGE 语句听起来像是完成这项工作的工具。

例子:

MERGE [dbo].[res_opt_junc] roj
USING (SELECT @Res_id AS Res_id, @Opt_id AS Opt_id, @IsActive AS IsActive) AS nv
ON roj.Res_id = nv.Res_id AND roj.Opt_id = nv.Opt_Id
WHEN MATCHED THEN
    UPDATE SET roj.IsActive = nv.IsActive
WHEN NOT MATCHED THEN
    INSERT (Res_id, Opt_id, IsActive) VALUES (nv.Res_id, nv.Opt_id, nv.IsActive)
;

当然,鉴于 Res_idOpt_id 是主键的组成部分。

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多