不太明白IN声明。第一个变体工作正常:
select manufacturers.id
from manufacturers
where manufacturers.id in (select manufacturerId
from pcs group by manufacturerId
having count(manufacturerId) > 1)
但是当我向子查询做一个程序时:
CREATE PROCEDURE [dbo].Get_manufacturers @productType varchar(50)
as
begin
declare @query varchar(500)
set @query='select manufacturerId from ' + QuoteName(@productType) + '
group by manufacturerId having count(manufacturerId) > 1'
declare @t table (manufacturerId int)
insert into @t exec(@query)
select manufacturerId from @t;
end
select manufacturers.id
from manufacturers
where manufacturers.id in (Get_manufacturers 'pcs')
我收到错误:消息102,级别15,状态1,第4行 ' pcs'
附近的语法不正确Get_manufacturers' pcs'工作正常。我哪里错了?
答案 0 :(得分:1)
不太明白IN语句
...
Get_manufacturers'pcs'正常工作 - 它返回一个表
您误解了stored procedures
和IN
条件。
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
存储过程返回的不是子查询,也不是表达式。 这是一个了解子查询是Using a Subquery in a T-SQL Statement
的链接子查询是嵌套在另一个T-SQL中的SELECT语句 声明
因此存储过程不是子查询,它只是一个SELECT语句。 但即使你说存储过程返回一个表也是错误的:你可以将表连接到另一个表但是你不能加入存储过程的结果。 即使你“看到”一个过程返回的结果集作为“表”,它也不是一个表。
答案 1 :(得分:1)
基于Rokuto和Gordon Linoff的建议,通过省略表声明来改变程序:
App\CentroVotacion::all();
然后,使用临时表填写存储过程的结果。
ALTER PROCEDURE [dbo].Get_manufacturers @productType nvarchar(50)
as
begin
declare @query nvarchar(500)
set @query= N'select manufacturerId from ' + QuoteName(@productType) + '
group by manufacturerId having count(manufacturerId) > 1'
---declare @t table (manufacturerId int)
---insert into @t exec(@query)
---select manufacturerId from @t;
exec(@query)
end
GO
最后,将其添加到您的IN状态。
IF(OBJECT_ID('tempdb..#tmp_manufacturers') IS NOT NULL)
BEGIN
DROP TABLE #tmp_manufacturers
END
CREATE TABLE #tmp_manufacturers
(
manufacturerId int
)
INSERT INTO #tmp_manufacturers (manufacturerId)
EXEC dbo.Get_manufacturers 'pcs'
答案 2 :(得分:0)
正如@Gordon Linoff所说,程序不会返回表格。 但是,如果要存储来自存储过程的输出数据,则需要将其放入表e中。 G:
DECLARE @manufactures TABLE (Id int)
INSERT INTO @manufactures
exec Get_manufacturers 'pcs'
select manufacturers.id
from manufacturers
where manufacturers.id IN (SELECT Id FROM @manufactures)
您可以使用临时表而不是表变量。