2010-05-15 3 views
1

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

Неверное имя объекта '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 <[email protected] 
    ORDER BY NEWID() 
)as d 

union 

select * from 
(
    select TOP 1 * FROM [dbo].[products] competingproducts 
    where competingproducts.categoryId =-2 
    --and competingproducts.Price <[email protected] 
    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

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

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

Некоторые точки, хотя:

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

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

2

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

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

create table #tmp (blah, blah) 

Insert into #tmp 
exec dbo.sprocName 
+0

Вы также можете создать представление, которое возвращает данные, которые вы запрашиваете, если весь пакет GetSuitableCategories SP запускается с помощью оператора Select. – heartlandcoder

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