我正在尝试构建一个使用另一个存储过程的存储过程。获取结果并将其作为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
答案 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)
)
但有些观点:
如果你对3个参数有额外的处理,那么你需要一个多语句表值函数,但要注意这些可能很慢