эта хранимая процедура правильная? - PullRequest
0 голосов
/ 27 сентября 2010

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

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

2 голосов
/ 28 сентября 2010

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

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

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

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

BEGIN TRY
    INSERT ... LinkedServer.DB.Schema.Table ...
END TRY
BEGIN CATCH
    -- Error Handling Code --
    ...
END CATCH
1 голос
/ 28 сентября 2010

Сначала убедитесь, что ваши связанные серверы настроены.

Вот краткий обзор MS по связыванию серверов.
Вот статья о фактическом синтаксисекоманды.

Похоже, что после ваших изменений (удаления GO) процесс будет выполняться, но невозможно точно знать, не зная, как выглядят ваши таблицы - какие столбцы есть в каких таблицах икак они соотносятся.

Некоторые соображения по поводу эффективности:

  • IN не очень эффективный оператор.Вместо этого вы почти всегда можете получить более высокую производительность, используя EXISTS.
  • У вас есть несколько предложений WHERE с OR ... это также будет довольно неэффективно (поскольку SQL Server будетпроверка каждого для каждого условия).Вам нужно разрешить 'NULL' в вашем ценовом столбце?Вам нужно разрешить NULL в вашем столбце NDC? Помните, NULL отличается от пустого или 0 ... .Если вы удалите свою пустоту из полей NDC и price, ваши 4 операции станут 1 операцией (PRICE <= 0).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...