|
我有一个存储处方药信息的表,需要每天从中央处方中心更新。临时表与药物表相同。临时表数据可能与主表相同(在大多数情况下),或者可能有更新线或新线。
. a6 R4 V# M" I5 n( ~; y我有一个更新主表的存储过程,但它失败了,因为它不会更新NULL行(如果临时表中有新行)。
# @ U9 V; Y/ o$ n2 J这是MSSQL Server 2005。
2 \2 ?9 O: ?; \% f6 T5 F这里我在哪里错了:
* W- c( ^1 } J/ m. A -- Insert statements for procedure hereUPDATE [RX_Billing].[dbo].[FS_Drug]SET [TRADENAME] = [RX_Billing].[dbo].[FS_Drug_TEMP].[TRADENAME] ,[CDM] = [RX_Billing].[dbo].[FS_Drug_TEMP].[CDM] ,[NDC] = [RX_Billing].[dbo].[FS_Drug_TEMP].[NDC] ,[IP_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[IP_COST] ,[OP_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[OP_COST] ,[HH_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[HH_COST] ,[VAR_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[VAR_COST] ,[LSTUPDATE] = [RX_Billing].[dbo].[FS_Drug_TEMP].[LSTUPDATE]FROM [RX_Billing].[dbo].[FS_Drug]RIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] ON [RX_Billing].[dbo].[FS_Drug].[TRADENAME] = [RX_Billing].[dbo].[FS_Drug_TEMP].[TRADENAME]编辑:' c: N6 J8 b" r. ^2 Y. {. g; I# x
我去了罗里的代码。谢谢,效果很好。4 x7 |" ]' v6 U& {
给Orion Edwards的注释:UPSERT / MERGE正是我想要的,但是SQL Server9 o3 _' n% b4 U/ a* I t6 f
2005不支持。显然是计划好的,但是没有发布这个版本。Server 2008年可用。Interwebs告诉我内容。
3 H @7 f* B% i3 P0 T- G
g1 a+ H# i- l# f( { 解决方案: 9 D2 |8 q, R8 m) C0 B3 r
先执行标准方法UPDATE,然后执行INSERT:
/ C+ [7 S4 v) Y. S* l N2 v-- UPDATE rows using an INNER JOIN with matching TRADENAME. No need to update TRADENAME column.UPDATE drugSET [CDM] = tmp.[CDM] ,[NDC] = tmp.[NDC] ,[IP_COST] = tmp.[IP_COST] ,[OP_COST] = tmp.[OP_COST] ,[HH_COST] = tmp.[HH_COST] ,[VAR_COST] = tmp.[VAR_COST] ,[LSTUPDATE] = tmp.[LSTUPDATE]FROM [RX_Billing].[dbo].[FS_Drug] drugINNER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp ON drug.[TRADENAME] = tmp.[TRADENAME]-- Insert rows that don't have matching TRADENAMEINSERT INTO drugSELECT tmp.[TRADENAME] ,tmp.[CDM] ,tmp.[NDC] ,tmp.[IP_COST] ,tmp.[OP_COST] ,tmp.[HH_COST] ,tmp.[VAR_COST] ,tmp.[LSTUPDATE]FROM [RX_Billing].[dbo].[FS_Drug] drugRIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp ON drug.[TRADENAME] = tmp.[TRADENAME]WHERE drug.[TRADENAME] IS NULL您可能需要删除或不再存在tmp中间的任何药物记录都被删除了。UPDATE执行相同的单独语句,但应使用LEFT OUTER
. q8 j. Q) P) PJOIN,其中tmp.TRADENAME为NULL。 |
|