2013-07-08 6 views
1

У меня есть хранимая процедура, в которой я отлично работал в среду, но больше не работает должным образом. Я не изменил ни одного кода, и по какой-то причине он просто не действует одинаково.SQL Server необходимо запустить один и тот же запрос Несколько раз, чтобы получить желаемые результаты

Вот фрагмент кода, который не работает:

WITH Minimum AS (SELECT DataTable.PortID, [Rating Max], 
    CASE When [Rating Max] <= [Sector Max] And [Rating Max] <= [ConcAfterUnwritten] And [Rating Max] <= [NatAfterUnwritten] And [Rating Max] <= [CashMaxAfterUnwritten] And [Rating Max] <= MatAfterUnwritten And [Rating Max] <= MatAfterInitialConcentration Then [Rating Max] 
     When [Sector Max] <= [ConcAfterUnwritten] And [Sector Max] <= [NatAfterUnwritten] And [Sector Max] <= CashMaxAfterUnwritten And [Sector Max] <= MatAfterUnwritten And [Sector Max] <= MatAfterInitialConcentration Then [Sector Max] 
     When ConcAfterUnwritten <= NatAfterUnwritten And ConcAfterUnwritten <= CashMaxAfterUnwritten And ConcAfterUnwritten <= MatAfterUnwritten And ConcAfterUnwritten <= MatAfterInitialConcentration Then ConcAfterUnwritten 
     When NatAfterUnwritten <= CashMaxAfterUnwritten And NatAfterUnwritten <= MatAfterUnwritten And NatAfterUnwritten <= MatAfterInitialConcentration Then NatAfterUnwritten 
     When CashMaxAfterUnwritten <= MatAfterUnwritten And CashMaxAfterUnwritten <= MatAfterInitialConcentration Then CashMaxAfterUnwritten 
     When MatAfterUnwritten <= MatAfterInitialConcentration Then MatAfterUnwritten 
     Else MatAfterInitialConcentration 
     End As [Min Of 5 Restrictions] 
FROM DataTable) 
UPDATE DataTable 
Set 
    DataTable.MinOf5Restrictions = Minimum.[Min Of 5 Restrictions], 
    DataTable.MktValueAllocation = IIF(Minimum.[Min Of 5 Restrictions] < DataTable.MatAfterInitialConcentration, 0, DataTable.MatAfterInitialConcentration), 
    DataTable.ModelParAmount = IIf([MktValueAllocation]=0,0,Round([MktValueAllocation]/([$Px+Acc]*10)/5,0,1)*5), 
    DataTable.AllocatedPar = IIF(DataTable.ModelParAmount = 0, 0, ParLots.AllocatedPar), 
    DataTable.[Check Cash And Concentration] = IIf(DataTable.[AllocatedPar]*[$Px+Acc]*10>[MinOf5Restrictions],[ModelParAmount],DataTable.[AllocatedPar]), 
    DataTable.[Final After State Switch] = IIf([StateOnly]='TRUE',IIf([RestrictionType]='Specific',[Check Cash And Concentration],0),[Check Cash And Concentration]) 
FROM 
    ((DataTable INNER JOIN Minimum ON DataTable.PortID = Minimum.PortID) LEFT JOIN ParLots ON DataTable.ModelParAmount = ParLots.ModelPar) INNER JOIN TestSet ON DataTable.PortID = TestSet.PortID, Main; 

Моя нынешняя проблема в том, что я должен выполнить запрос в 6 раз для того, чтобы получить результат, который я хочу. По сути, оператор UPDATE, похоже, обновляет один из столбцов каждый раз, когда я его выполняю, а не все шесть одновременно. В первый раз, когда он выполняется, MinOf5Restrictions заселен, но другие столбцы отсутствуют, второй раз MktValueAllocation заселен, но последние 4 все еще пусты и т. Д.

Любая идея, почему это может быть? Я полагаю, что я мог бы разделить его на 6 разных операторов UPDATE, но я бы предпочел, если мне это не нужно, тем более, что я работал раньше.

Благодаря

+0

Вы можете добавить предложение 'OUTPUT' в оператор' UPDATE' и посмотреть, что обновляется в каждом проходе. Для тестирования вы можете обернуть его в 'BEGIN TRANSACTION' /' ROLLBACK TRANSACTION'. Это позволит вам повторно запустить запрос без фактического обновления таблицы. – HABO

+0

Я бы рекомендовал вам отлаживать ваш запрос, частично по частям, особенно все эти встроенные ifs и случай выбора, чтобы быть уверенным, что они возвращают требуемое значение. – Rafael

ответ

2

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

WITH Minimum AS 
(
    SELECT 
     DataTable.PortID 
     ,[Rating Max] 
     ,CASE 
      When [Rating Max] <= [Sector Max] And [Rating Max] <= [ConcAfterUnwritten] And [Rating Max] <= [NatAfterUnwritten] And [Rating Max] <= [CashMaxAfterUnwritten] And [Rating Max] <= MatAfterUnwritten And [Rating Max] <= MatAfterInitialConcentration Then [Rating Max] 
      When [Sector Max] <= [ConcAfterUnwritten] And [Sector Max] <= [NatAfterUnwritten] And [Sector Max] <= CashMaxAfterUnwritten And [Sector Max] <= MatAfterUnwritten And [Sector Max] <= MatAfterInitialConcentration Then [Sector Max] 
      When ConcAfterUnwritten <= NatAfterUnwritten And ConcAfterUnwritten <= CashMaxAfterUnwritten And ConcAfterUnwritten <= MatAfterUnwritten And ConcAfterUnwritten <= MatAfterInitialConcentration Then ConcAfterUnwritten 
      When NatAfterUnwritten <= CashMaxAfterUnwritten And NatAfterUnwritten <= MatAfterUnwritten And NatAfterUnwritten <= MatAfterInitialConcentration Then NatAfterUnwritten 
      When CashMaxAfterUnwritten <= MatAfterUnwritten And CashMaxAfterUnwritten <= MatAfterInitialConcentration Then CashMaxAfterUnwritten 
      When MatAfterUnwritten <= MatAfterInitialConcentration Then MatAfterUnwritten 
      Else MatAfterInitialConcentration 
     End As [Min Of 5 Restrictions] 
    FROM DataTable 
) 
SELECT 
    Minimum.[Min Of 5 Restrictions] [MinOf5Restrictions], 
    IIF(Minimum.[Min Of 5 Restrictions] < DataTable.MatAfterInitialConcentration, 0, DataTable.MatAfterInitialConcentration) [MktValueAllocation], 
    IIf([MktValueAllocation]=0,0,Round([MktValueAllocation]/([$Px+Acc]*10)/5,0,1)*5) [ModelParAmount], 
    IIF(DataTable.ModelParAmount = 0, 0, ParLots.AllocatedPar) [AllocatedPar], 
    IIf(DataTable.[AllocatedPar]*[$Px+Acc]*10>[MinOf5Restrictions],[ModelParAmount],DataTable.[AllocatedPar]) [Check Cash And Concentration], 
    IIf([StateOnly]='TRUE',IIf([RestrictionType]='Specific',[Check Cash And Concentration],0),[Check Cash And Concentration]) [Final After State Switch] 
FROM 
    ((DataTable 
    INNER JOIN Minimum ON 
     DataTable.PortID = Minimum.PortID) 
    LEFT JOIN ParLots ON 
     DataTable.ModelParAmount = ParLots.ModelPar) 
    INNER JOIN TestSet ON DataTable.PortID = TestSet.PortID 

Если вы хотите какой-либо дополнительной помощи было бы полезно, если бы вы могли бы упростить запрос (и делать это также может помочь вам найти проблему).

+0

Спасибо за помощь Уоррен. Хотя я действительно не нашел проблему, почему она не работает, ваш совет определенно поможет мне в будущем. Как ни странно, если я разделил его на 6 отдельных операторов UPDATE, он работает так, как я этого хочу. Вероятно, я просто останусь с 6 операциями обновления, так как минимальное количество хитов в нескольких операциях обновления не стоит времени или головной боли, чтобы попробовать и исправить. Я считаю, что проблема в том, что третий столбец ModelParAmount читает каждый столбец MktValueAllocation в виде 0, поэтому он, похоже, выполняет это утверждение перед другим – ajh256

Смежные вопросы