下面有一个存储过程,我不知道它是否正确。
我在表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)
答案 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列中允许NULL
? Remember NULL
is different from blank or 0...。如果从NDC和价格字段中删除可空性,则您的4个操作将变为1个操作(PRICE <= 0
)。