Sql Server2012 如何在存储过程中实现根据判断插入更新数据

目标表唯一字段:hrid,该字段不为空也不为NULL!图片说明
图片说明
通过存储过程插入数据时加入判断条件语句,判断结果hrid字段与数据源中有相同值时删除目标表相同数据(整条记录),在做插入!请各位大佬给出语句!存储过程如下
create procedure [dbo].[PACS_His_Report_insert] as
insert into PACS_His_Report (a,b,c,d....) select (a,b,c,d....) [192.168.0.18].pacs4all.dbo.His_Report a (nolock)
where a.RepDate > (select max(b.RepDate) from PACS_His_Report b)

7个回答

先判断删除存在的,再一次性插入不就完了么?

qq_17615939
泡le沫 回复喏喏_: 这样是直接把现有数据都删除了!在重新插入一遍的!不行的!能否结合一下最后的where自己做一下筛选?
2 年多之前 回复
love84385654
喏喏_ 回复泡le沫: create procedure [dbo].[PACS_His_Report_insert] as delete from PACS_His_Report where hrid in ( select hrid [192.168.0.18].pacs4all.dbo.His_Report ) insert into PACS_His_Report (a,b,c,d....) select (a,b,c,d....) [192.168.0.18].pacs4all.dbo.His_Report a (nolock) where a.RepDate > (select max(b.RepDate) from PACS_His_Report b)
2 年多之前 回复
qq_17615939
泡le沫 语句呢?大佬?
2 年多之前 回复

1、数据库表结构

所用数据库为Sql Server2008。

2、创建存储过程

(1)实现功能:

    有相同的数据,直接返回(返回值:0);
    有主键相同,但是数据不同的数据,进行更新处理(返回值:2);
    没有数据,进行插入数据处理(返回值:1)。 

根据不同的情况设置存储过程的返回值,调用存储过程的时候,根据不同的返回值,进行相关的处理。

你的问题描述的不是很清楚,这个存储过程触发的前提是什么,还有需要入参么,是全表修改还是只改一条记录 如果这个字段的值不存在呢?不存在是不是就直接更新赋值,那如果是这样的话为什么要用存储过程来做直接sql实现不是很好么

您好 ,您可以尝试在存储过程(函数中)使用条件判断语句,具体可以参考如下例子: 定义一个变量 c,当c小于50时候 执行某段代码
declare @c int

set @c=1
while @c<50
begin
执行代码...
end

BEGIN
DECLARE my_hrid VARCHAR(3000);

SELECT hrid INTO my_hrid FROM `youTableName` WHERE id = '传入的参数(你的描述不是很清楚,我只是给你提供思路)';

-- 开始做判断 上面已经获取到了hrid的值
IF '传入的参数' == my_hrid THEN
    RETURN 0;
ELSEIF '传入的参数' != my_hrid THEN
    -- 开始更新操作
    UPDATE `youTableName` SET hrid = '传入的参数' WHERE `你的条件`;
    RETURN 2;
ELSEIF  my_hrid IS NULL THEN
    -- 开始操作
    UPDATE `youTableName` SET hrid = '传入的参数' WHERE `你的条件`;
    RETURN 1;
END IF;

END;

 你的描述不是很清楚 也没有描述入参是什么类型 然后是什么样的数据之类的 我只是给你一个大概 给你做一个参考 希望对你有帮助
qq_17615939
泡le沫 问题已更新,要求先判断存在的并删除,再根据存储后面的语句进行数据插入
2 年多之前 回复

create procedure [dbo].[PACS_His_Report_insert] as
insert into PACS_His_Report (所有字段) select (所有字段) [192.168.0.18].pacs4all.dbo.His_Report a (nolock)
where a.RepDate > (select max(b.RepDate) from PACS_His_Report b)
and a.RecID<>a.RecID

create procedure [dbo].[PACS_His_Report_insert] as
delete from PACS_His_Report where hrid in (select hrid from [192.168.0.18].pacs4all.dbo.His_Report a (nolock))

insert into PACS_His_Report (所有字段) select (所有字段) [192.168.0.18].pacs4all.dbo.His_Report a (nolock)
where a.RepDate > (select max(b.RepDate) from PACS_His_Report b)

qq_17615939
泡le沫 你这么写我后面的WHERE字句就没用了!要结合后面的WHERE字句!
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问