IN条件的不同结果

时间:2017-07-08 17:19:55

标签: sql sql-server

不太明白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'工作正常。我哪里错了?

3 个答案:

答案 0 :(得分:1)

  

不太明白IN语句

     

...

     

Get_manufacturers'pcs'正常工作 - 它返回一个表

您误解了stored proceduresIN条件。

来自IN (Transact-SQL)

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)

您可以使用临时表而不是表变量。