代码之家  ›  专栏  ›  技术社区  ›  Joh

这个存储过程正确吗?

  •  0
  • Joh  · 技术社区  · 14 年前

    我正在表中插入记录 PlanFinder.InvalidAwps ,并从 PlanFinder.NdcAwp 桌子。

    Alter procedure PlanFinder.InsertInvalidRecords 
    as 
    
    Truncate table [PlanFinder].[InvalidAwps]  
    
    INSERT INTO [PlanFinder].[InvalidAwps](Ndc, AwpUnitCost)      
       SELECT DISTINCT P.Ndc Ndc, A.Price AwpUnitCost  
         FROM PlanFinder.PlanFinder.HpmsFormulary P  
    LEFT JOIN (SELECT Ndc, Price 
                 FROM MHSQL01D.Drug.FdbPricing.vNdcPrices   
                WHERE PriceTypeCode = '01' 
                  AND CurrentFlag = 1) A ON P.Ndc = A.Ndc   
        WHERE (   A.Ndc IS NULL 
               OR A.Price <= 0 
               OR A.Price IS NULL)  
          AND p.Ndc IS NOT NULL 
    
    DELETE FROM PlanFinder.NdcAwp 
    WHERE Ndc IN (SELECT Ndc 
                    FROM PlanFinder.InvalidAwps)
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Jeff Wight    14 年前

    你的问题还是有点不清楚。”这个存储过程正确吗?”是相当模糊的,你还要求一些帮助,在“尝试。。。抓住“逻辑”。

    首先,你在寻找什么样的“正确”?如果您只需要“validsql”,那么假设您的链接服务器MHSQL01D设置正确并且所有对象名都有效,是的,它应该可以工作。您可以截断、插入和删除该过程中的所有内容。

    还有其他问题,比如“IN”的表现。此外,您正在连接到链接服务器上的一个表,并实际返回(可能,取决于有多少有效案例)大量您只需丢弃的数据(来自vNdcPrices的所有数据,其中Price>0)。我假设无效的案例是较小的集合,所以您可以重写它,这样较小的数据集就是通过有线传输的数据集。

    至于另一个问题,你想抓住什么?执行过程但链接服务器端出现问题时出现异常(链接服务器关闭、表丢失等),还是创建过程时出现异常?链接服务器需要启动,表需要启动,所有名称在创建/更改时都有效。如果希望在执行时捕获问题,则以下操作将起作用:

    BEGIN TRY
        INSERT ... LinkedServer.DB.Schema.Table ...
    END TRY
    BEGIN CATCH
        -- Error Handling Code --
        ...
    END CATCH
    
        2
  •  1
  •   JNK    14 年前

    Here is an overview from MS on linking servers.
    Here is an article on the actual syntax of the command.

    看起来这个过程会在你的编辑之后运行(删除GO),但是如果不知道你的表是什么样子的-哪些列在哪些表中以及它们之间的关系如何,就不可能确定。

    需要考虑的一些事情:

    • IN 不是一个很有效率的操作员。使用 EXISTS 相反。
    • 你有多个 WHERE 带的子句 OR NULL 在你的国家数据中心专栏里? Remember NULL is different from blank or 0... . 如果从NDC和price字段中删除可空性,则4个操作将变为1个操作( PRICE <= 0