2016-03-15 3 views
2

Привет У меня есть SP, в котором я создаю временную таблицу для хранения некоторых значений.Таблица Temp содержит только одну строку

ALTER PROCEDURE [dbo].[test] 
    @id int, 
    @funds_limit money 
AS 
BEGIN 
     SET NOCOUNT ON; 
     DECLARE @threshold money; 

     CREATE TABLE #ConfigurationTemp 
        (id int, 
        name varchar(100) not null, 
        type varchar(100), 
        value varchar(100)) 

     INSERT #ConfigurationTemp EXEC get_config @id, 'testType', null 

     select @threshold = value 
     from #ConfigurationTemp 
     where [email protected] and name='testLimit' 
     print @threshold 

     IF (@funds_limit IS NOT NULL) AND (@threshold < @funds_limit) 
     BEGIN 
     DROP TABLE #ConfigurationTemp; 
     RETURN 1000; 
     END 

     select @threshold = value 
     from #ConfigurationTemp 
     where [email protected] and name='testLimit1' 
     print @threshold 

     IF (@funds_limit IS NOT NULL) AND (@threshold < @funds_limit) 
     BEGIN 
      DROP TABLE #ConfigurationTemp; 
      RETURN 1001; 
     END  
    END   
    RETURN 0; 
END 

Временная таблица имеет несколько рядов. например:

1, fund_limit, testType, 10 
2, fund_min_limit, testType, 20 

мне нужно сначала проверить значение для fund_limit (10) со значением пользовательского ввода (который будет входным параметром для SP). Если проверка не выполняется, я возвращаюсь с кодом ошибки. Если нет, я иду на следующую проверку. то есть fund_min_limit. Я делаю то же самое с этим и возвращаю другой код ошибки. Если проверка не завершена, я верну 0, что считается успешным.

В этом случае я получаю такое же значение для порога. то есть значение первой строки ... 10.

Как получить различное пороговое значение из таблицы temp относительно имени?

+2

Примечание: Временные таблицы автоматически удаляются при выходе из хранимой процедуры, которая их создала. Для этого нет необходимости вручную 'DROP TABLE'. –

+1

Также, как вы знаете, что он содержит только одну строку? Это может легко * содержать несколько строк, но ваши операторы 'SELECT @scalarvariable = columnvalue', очевидно, будут только назначать переменную одним возможным значением из одной строки. –

+0

Я могу только догадываться, но я бы сказал, что проблема '@ id', которую вы передаете в хранимую процедуру' get_config', может быть проблемой ...? – Kidiskidvogingogin

ответ

0

У вас есть RETURN в вашем IF статута.

... RETURN 1000 
    and 
    ... RETURN 1001 

После ввода строки конец процедуры.

Может быть, вы хотите присвоить результат переменной

@return_Value = '' 

    @return_Value = @return_Value + '1000, '    
.... 
    @return_Value = @return_Value + '1001, ' 

RETURN @return_Value 
+0

Мне нужно выйти из SP, если есть одна ошибка. Вот почему я возвращаюсь из условия if. –

1

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

Итак, если вы ошибочно указали второе имя порога, вы можете получить такое же значение @threshold, потому что второй оператор ничего не присваивает вашей переменной. I.e переменная содержит значение из предшествующего присвоения (select). Вы можете протестировать его с дополнительной переменной для второго порога - он всегда будет NULL, если я догадался о причине проблемы.

Также вы применяете тот же фильтр @id, который является скалярной переменной. Но ваши строки имеют разные идентификаторы. Таким образом, сейчас нет шансов получить значение другого порога, чем для данного @id.

set @threshold = (select t.value 
    from #ConfigurationTemp t 
    where t.name='testLimit') 
    print @threshold 

    IF @threshold < @funds_limit 
    RETURN 1000; 

    set @threshold = (select t.value 
    from #ConfigurationTemp t 
    where t.name='testLimit 2') 
    print @threshold 

    IF @threshold < @funds_limit 
     RETURN 1001; 

If будет успешным только тогда, когда оба аргумента NOT NULL.

Еще один подход:

declare 
    @threshold_a int, 
    @threshold_b int, 
    @threshold_c int 

;with test as 
(
    select 'a' as name, 25 as value 
    union all 
    select 'b', 3 
    union all 
    select 'c', 100 
    union all 
    select 'd', -1 
) 
select 
    @threshold_a = case when t.name = 'a' then t.value else @threshold_a end, 
    @threshold_b = case when t.name = 'b' then t.value else @threshold_b end, 
    @threshold_c = case when t.name = 'c' then t.value else @threshold_c end 
from test t 

select 
    @threshold_a as [a], 
    @threshold_b as [b], 
    @threshold_c as [c] 

GO 

одиночные, выберите несколько переменных.

+0

У меня такая же проблема. В моем случае есть 4 строки в таблице temp для одного и того же идентификатора и типа. Но имя другое. Я хочу получить пороговое значение для этих 4 разных имен. Поэтому каждый раз я пишу запрос выбора, о котором говорил Срешад. В первый раз я получаю значение. Но во второй раз, когда я присваиваю значение новой переменной, я получаю нулевое значение. Кажется, что моя временная таблица не имеет строки, соответствующей названию, которое я упомянул во второй раз. Есть ли проблема с тем, что я делаю? –

+0

@DivyaRose вы пытались 'select *' без фильтра, чтобы проверить, что там в вашей таблице темп? –

+0

Да. Я сделал. Было 4 ряда. До тех пор все кажется хорошим и прекрасным. Когда начинается проверка, кажется, что в таблице есть только одна строка. –

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