tsql - использование внутренней хранимой процедуры в качестве параметра where - PullRequest
1 голос
/ 16 мая 2010

Я пытаюсь создать хранимую процедуру, которая использует другую хранимую процедуру. Принимая его результат и используя его как часть предложения where, по какой-то причине я получаю сообщение об ошибке:

Неверное имя объекта 'dbo.GetSuitableCategories'.

Вот копия кода:

select distinct top 6 * from
 (
  SELECT TOP  100 *
  FROM [dbo].[products] products 
  where products.categoryId in
  (select top 10 categories.categoryid from 
    [dbo].[GetSuitableCategories] 
      (
      -- @Age
      -- ,@Sex
      -- ,@Event
      1,
      1,
      1
     ) categories
    ORDER BY NEWID() 
  )
  --and products.Price <=@priceRange 
  ORDER BY NEWID() 
 )as d

 union 

 select * from
 (
   select  TOP 1 * FROM [dbo].[products] competingproducts
   where competingproducts.categoryId =-2
   --and competingproducts.Price <=@priceRange 
   ORDER BY NEWID()
 ) as d 

и вот [dbo]. [GetSuitableCategories]:

if (@gender =0) 
   begin
    select * from categoryTable categories
    where categories.gender =3
   end
  else
   begin
    select * from categoryTable categories
    where categories.gender = @gender
    or categories.gender =3
   end

Ответы [ 2 ]

2 голосов
/ 16 мая 2010

Я бы использовал встроенную табличную пользовательскую функцию. Или просто закодируйте его в строке, повторное использование не требуется

CREATE dbo.GetSuitableCategories
           (
--parameters
          )
RETURNS TABLE
AS
RETURN (
    select * from categoryTable categories
    where categories.gender IN (3, @gender)
)

Некоторые моменты, хотя:

  • Я полагаю, что у categoryTable нет пола = 0
  • Есть ли у вас 3 пола в вашей таблице? : -)
  • Почему передаются 3 параметра, а используется только 1? Смотрите ниже, пожалуйста
  • Отображается ли @sex на @gender?

Если у вас есть дополнительная обработка по 3 параметрам, то вам понадобятся функции с множеством операторов и табличными значениями, но будьте осторожны, они могут быть медленными

2 голосов
/ 16 мая 2010

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

Я думаю, что это действительно, но я делаю это по памяти

create table #tmp (blah, blah)

Insert into #tmp
exec dbo.sprocName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...