2010-09-27 4 views
0

У меня есть хранимая процедура ниже, и я не знаю, правильно ли это.Эта хранимая процедура правильная?

Я вставляю записи в таблицу 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

Какая система баз данных? –

+0

Что он должен делать? Как выглядит 'InvlidAwps'? – Oded

+0

Спасибо, его MSSQL. – 2010-09-27 19:49:19

ответ

2

Ваш вопрос по-прежнему немного неясен. «Правильно ли эта хранимая процедура?» довольно расплывчато, и вы также попросили некоторую помощь добавить в логику «Попробуйте ... Ловить».

Во-первых, какие «правильные» вы ищете? Если «действительный sql» - это все, что вам нужно, то при условии, что ваш связанный сервер MHSQL01D настроен правильно, и все имена объектов действительны, да, он должен работать. Вы можете усекать, вставлять и удалять все в рамках этой процедуры.

Другие проблемы, такие как исполнение «IN». Кроме того, вы присоединяетесь к таблице на связанном сервере и фактически возвращаете (возможно, в зависимости от количества действительных случаев) много данных, которые вы просто выбрасываете (все данные из vNdcPrices, где Price> 0). Я предполагаю, что недопустимые случаи - это меньший набор, поэтому вы можете переписать его так, чтобы меньший набор данных был отправлен по проводу.

Что касается другого вопроса, что вы пытаетесь поймать? Исключение, когда процедура выполняется, но есть проблема на связанной стороне сервера (связанный сервер вниз, таблица ушла и т. Д.) Или исключение при создании процедуры? Связанный сервер должен быть вставлен, и таблица должна быть заполнена, а все имена действительны при создании/изменении времени. Если вы хотите уловить проблемы во время выполнения, то будут работать:

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

Во-первых, убедитесь, что ваши связанные серверы настроены.

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 ... это тоже будет довольно неэффективно (поскольку SQL Server будет проверять каждый для каждого условия). Вам нужно разрешить «NULL» в столбце цены? Вам нужно разрешить NULL в столбце NDC? Remember NULL is different from blank or 0.... Если вы удалите свою нулеуточность из полей NDC и цены, ваши 4 операции станут 1 операцией (PRICE <= 0).
Смежные вопросы