У меня есть хранимая процедура, в которой я отлично работал в среду, но больше не работает должным образом. Я не изменил ни одного кода, и по какой-то причине он просто не действует одинаково.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, но я бы предпочел, если мне это не нужно, тем более, что я работал раньше.
Благодаря
Вы можете добавить предложение 'OUTPUT' в оператор' UPDATE' и посмотреть, что обновляется в каждом проходе. Для тестирования вы можете обернуть его в 'BEGIN TRANSACTION' /' ROLLBACK TRANSACTION'. Это позволит вам повторно запустить запрос без фактического обновления таблицы. – HABO
Я бы рекомендовал вам отлаживать ваш запрос, частично по частям, особенно все эти встроенные ifs и случай выбора, чтобы быть уверенным, что они возвращают требуемое значение. – Rafael