这个存储过程是否正确?

时间:2010-09-27 19:46:06

标签: sql sql-server tsql

下面有一个存储过程,我不知道它是否正确。

我在表PlanFinder.InvalidAwps中插入记录,并从PlanFinder.NdcAwp表中删除相同的记录。

另外,有人可以帮我在同一个存储过程中添加try catch吗?

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 个答案:

答案 0 :(得分:2)

你的问题仍然有点不清楚。 “这个存储过程是否正确?”是相当模糊的,你还要求一些帮助添加“Try ... Catch”逻辑。

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

还有其他问题,例如“IN”的表现。此外,您正在加入链接服务器上的表并实际返回(可能,取决于有多少有效案例)您丢弃的大量数据(来自vNdcPrices的所有数据,其中Price&gt; 0) 。我假设无效的情况是较小的集合,因此您可以重新编写它,以便较小的数据集是通过网络发送的。

就另一个问题而言,你想要抓住什么?执行过程但链接服务器端出现问题(链接服务器关闭,表格消失等)或创建过程时出现异常?链接服务器需要启动并且表需要启动并且所有名称在创建/更改时都有效。如果您想在执行时捕获问题,以下内容将起作用:

BEGIN TRY
    INSERT ... LinkedServer.DB.Schema.Table ...
END TRY
BEGIN CATCH
    -- Error Handling Code --
    ...
END CATCH

答案 1 :(得分:1)

首先,确保已设置链接服务器。

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

看起来proc会在你的编辑之后运行(删除GO),但是如果不知道你的表是什么样的话就不可能知道 - 什么列在哪些表中以及它们如何相关。

要考虑一些有效的事情:

  • IN不是一个非常有效的运营商。通过使用EXISTS代替,您几乎总能获得更好的性能。
  • 您有多个WHERE子句与OR的...这也将是非常低效的(因为SQL Server将检查每个条件的每个条件)。您是否需要在价格列中允许“空”?您是否需要在NDC列中允许NULLRemember NULL is different from blank or 0...。如果从NDC和价格字段中删除可空性,则您的4个操作将变为1个操作(PRICE <= 0)。