tsql - 使用内部存储过程作为参数是where子句

时间:2010-05-15 22:47:25

标签: tsql stored-procedures

我正在尝试构建一个使用另一个存储过程的存储过程。获取结果并将其作为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 个答案:

答案 0 :(得分:2)

您不能直接在select语句中使用存储过程的结果 您要么必须将结果输出到临时表中,要么将sproc转换为表值函数来执行您所做的操作。

我认为这是有效的,但我是从内存中做到这一点

create table #tmp (blah, blah)

Insert into #tmp
exec dbo.sprocName

答案 1 :(得分:2)

我会使用内联表值用户定义函数。或者简单地将其内联编码是不需要重复使用

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

但有些观点:

  • 我假设categoryTable没有性别= 0
  • 您的categoryTable中有3个性别? : - )
  • 为什么传入3个参数但只使用1?请见下文
  • @sex是否映射到@gender?

如果你对3个参数有额外的处理,那么你需要一个多语句表值函数,但要注意这些可能很慢