Member 14800672 Ответов: 1

Как поместить результат хранимой процедуры в условие в инструкции select?


Поэтому я вставляю несколько записей в один оператор select и в одно из условий (условие2) Я хочу как-то сказать (если вычитание 2 наборов результатов, возвращаемых из хранимой процедуры = 0), это выполнимо?

Вставить в таблицу 1 Выбрать *из таблицы 2, где condition1 и condition2

моя хранимая процедура имеет 2 оператора select, каждый из которых возвращает целое число

поэтому я хочу скопировать все записи из таблицы 2 в таблицу 1, где condition1 соответствует ей, и если ( для каждой записи в таблице 2, где result1 - result2 = 0), то все эти записи должны быть скопированы в таблицу 1

Что я уже пробовал:

Я не думаю, что смогу переписать два оператора select в моем операторе insert правильно)? итак, то, что я хочу сделать, выполнимо для вставки нескольких записей в один оператор insert select? или мне следует вставлять каждую запись одну за другой, чтобы иметь возможность это сделать?

Wendelius

Было бы легче решить эту проблему, если бы вы опубликовали все утверждения, которые пытаетесь использовать.

Member 14800672

Вот моя хранимая процедура
(
выберите поле 1 *из таблицы 2, где Id =@Id -- результат 1
выберите count(field1) из таблицы 2, где Id=@Id и Id2= @Id1 -- результат 2
)

Итак теперь я хочу сказать в новой хранимой процедуре
Вставить в таблицу 1 Выбрать из таблицы 2, где Id=@Id и Id2= @Id1 и (результат 1 - результат 2=0)

1 Ответов

Рейтинг:
1

Wendelius

Не уверен, что я полностью понимаю ситуацию, но один из вариантов - использовать функции вместо хранимой процедуры. Создание отдельных функций для извлечения значений поможет вам вернуть данные, которые могут быть использованы в условии.

Рассмотрим следующий пример
(однако имейте в виду, что функции, используемые в условии, обычно оказывают негативное влияние на производительность, если объем данных велик)

-- test table 1
create table t1 (
 id int,
 val int
);

insert into t1 values
(11,11),
(12,12),
(13,13);

-- test table 2
create table t2 (
 id1 int,
 id2 int,
 val int
);

insert into t2 values
(11,21,1),
(12,22,2),
(13,23,3);

-- test table 3
create table t3 (
 id int,
 val int
);

insert into t3 values
(1,1),
(1,2),
(2,1),
(2,2),
(3,1),
(3,2);

-- functions
create function f1 (@id int) returns int as
begin
   declare @retvalue int;
   select @retvalue = t1.val from t1 where t1.id = @id;
   return (@retvalue);
end;

select dbo.f1(11); -- returns 11

create function f2 (@id1 int, @id2 int) returns int as
begin
   declare @retvalue int;
   select @retvalue = t2.val from t2 where t2.id1 = @id1 and t2.id2 = @id2;
   return (@retvalue);
end;

select dbo.f2(dbo.f1(11), 21); -- returns 1

-- actual query to use functions in a condition
select * from t3 where t3.id = dbo.f2(dbo.f1(11), 21);

-- returns 
--
-- id   val
-- --   ---
-- 1    1
-- 1    2