Sql 从临时表更新表

Sql 从临时表更新表,sql,sql-server,Sql,Sql Server,我有一个存储处方药信息的表格,需要每天从中央处方药集中更新。临时表与药物表相同。临时表数据可以与主表相同(并且在大多数情况下都相同),也可以具有更新的行或新行 我有一个存储过程来更新主表,但它失败了,因为它不会更新空行(如果临时表中有新行) 这是MSSQL Server 2005 我在这里哪里出了问题: -- Insert statements for procedure here UPDATE [RX_Billing].[dbo].[FS_Drug] SET [TRADENAME] =

我有一个存储处方药信息的表格,需要每天从中央处方药集中更新。临时表与药物表相同。临时表数据可以与主表相同(并且在大多数情况下都相同),也可以具有更新的行或新行

我有一个存储过程来更新主表,但它失败了,因为它不会更新空行(如果临时表中有新行)

这是MSSQL Server 2005

我在这里哪里出了问题:

    -- Insert statements for procedure here
UPDATE [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]
编辑:

我用了Rory的密码。谢谢,效果很好


Orion Edwards注意:UPSERT/MERGE正是我想要的,但SQL Server 2005不支持它。显然这是计划好的,但没有发布。它在Server2008中提供。(根据Interwebs告诉我的。)

您不想在新行上进行插入,并在现有行上进行更新吗?如果我理解正确,将此更新为内部联接并添加单独的插入应该可以解决您的问题。

您可以尝试执行
UPSERT
(基本上是“if exists,update,else INSERT”)


标准方法是先进行更新,然后进行插入:

-- UPDATE rows using an INNER JOIN with matching TRADENAME. No need to update TRADENAME column.
UPDATE drug
SET [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] drug
INNER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp  
    ON drug.[TRADENAME] = tmp.[TRADENAME]

-- Insert rows that don't have matching TRADENAME
INSERT INTO drug
SELECT 
    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] drug
RIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp 
    ON  drug.[TRADENAME] = tmp.[TRADENAME]
WHERE drug.[TRADENAME] IS NULL 
您可能还希望删除或标记为已删除药物中不再在tmp中的任何记录。作为与UPDATE相同的单独语句执行此操作,但使用左侧外部联接,其中tmp.TRADENAME为NULL