1 ALTER PROC [dbo].[pro_med_records_sync] 2 AS 3 BEGIN 4 select distinct 病人号,身份证号护照号 into #tt from [192.168.101.33].[rmlis6].[dbo].[接口视图_申请单主表] where 申请日期 > cast(convert(varchar(10),getdate(),120) + ' 00:00:00' as datetime) 5 6 --患者同步 7 select distinct 病人号,身份证号护照号 into #tt from [192.168.101.33].[rmlis6].[dbo].[接口视图_申请单主表] where 申请日期 > cast(convert(varchar(10),getdate(),120) + ' 00:00:00' as datetime) 8 MERGE INTO [dbo].Yy_MedRecords t 9 USING(SELECT 10 * 11 FROM 12 OPENQUERY(HIS_DB,'SELECT PATIENTID, VISITID, ZYH, BEDNO, PATNAME, BIRTHDAY, SEX, PAT_STATUS, 13 CHARGE_TYPE, NURSE_CLASS, IN_HOS_TIME, DISGNOSE, DOCTORCODE, DOCTORNAME, DEPT_CODE, DEPT_NAME, 14 WARD_CODE, WARD_NAME, PREPAYMENTS, TOTAL_COSTS, VEDLOCK, JOB, ADDRESS, NATION, COMPANY, TEL, 15 CONTACT, RELATION, RETEL FROM NEXTCARE.VIEW_PATIENTS_INFO WHERE STATUS = ''在院''')) AS ht 16 ON t.InPatNo = ht.ZYH collate Chinese_PRC_CI_AS 17 WHEN MATCHED THEN 18 UPDATE SET t.PatName = ht.PATNAME, 19 t.Sex = ht.SEX, 20 t.DiagValue = ht.DISGNOSE, 21 t.Age=CASE WHEN DATEDIFF(YEAR,ht.BIRTHDAY,GETDATE())>0 THEN CONVERT(varchar,DATEDIFF(YEAR,ht.BIRTHDAY,GETDATE()))+'岁' 22 WHEN DATEDIFF(MONTH,ht.BIRTHDAY,GETDATE())=0 23 THEN CONVERT(varchar,DATEDIFF(DAY,ht.BIRTHDAY,GETDATE()))+'天' 24 ELSE CONVERT(varchar,DATEDIFF(MONTH,ht.BIRTHDAY,GETDATE()))+'个月' END, 25 t.IDNum = CASE WHEN t.IDNumis null THEN (select Convert(varchar(100),a.身份证号护照号 collate Chinese_PRC_CI_AS) from #tt as a where a.病人号 = ht.PATIENTID) 26 ELSE t.IDNum END, 27 t.InPatNo=ht.ZYH 28 29 30 WHEN NOT MATCHED BY TARGET THEN
1.SqlServer中临时表的应用
上面的存储过程用来同步医院患者信息,需要从LIS系统的检验申请单表中获取患者的身份证号,由于LIS检验申请表数据量过大,如果每次匹配更改,插入操作都从LIS数据库中查询,太耗费时间.
为了解决上面的问题,通过临时表来优化上面的Sql语句.将符合条件的LIS申请单相关字段导入到临时表中,再在每次匹配操作时从临时表中查询.
下面说一下临时表的操作:
1.1全局临时表和局部临时表:
全局临时表通过##t 来标记,而局部临时表通过#t标记,二者区别主要在于临时表失效时间,写在存储过程中的局部临时表在存储过程执行完后就自动失效,而全局临时表只有在SqlServer服务重启时才失效
1.2怎样创建临时表
select * into #t from table
2.MERGE INFO语句
2.1MERGE INTO语句的用法:
MERGE INTO语句用于表的同步,即将源表中的数据同步到目标表中,具体是对源表和目标表中能够匹配的行进行修改,对目标表中不存在而原表中存在的行进行插入,对原表中存在而目标表中不存在的行进行删除
2.2
MERGE INTO Target_Table as T
USING Source_Table as S
on T.Id = S.Id
WHEN MATCHED THNE
Update set T.Name = S.name
WHEN NOT MATCHED BY TARGET THNE
Insert .......
WHEN NOT MATCHED BY SOURCE THEN
Delete.../Update...
3.UPDATE 将一个表的字段更新到另一个表
UPDATE a SET a.DocId =b.F_Id FROM Yy_MedRecords a, dbo.Sys_User b WHERE a.DocCode=b.F_Account
将一个表中的数据更新到另一个表中,方法如上
另一中写法:
UPDATE A
SET A1 = B1, A2 = B2, A3 = B3
FROM A LEFT JOIN B ON A.ID = B.ID
此处也可以 right join 、 inner join