0

代码

create TYPE [dbo].[IntListType] as Table
(
[Number] [int] null
)

create procedure TestProc
(
    @l IntListType readonly
)
as
begin
    select * from products where ProductId in (select Number from @l)
end

create Table Products
(
    ProductId
    ProductName
)

insert into Products Values(1, 'One'),
                           (2, 'One'),
                           (3, 'Two'),
                           (4, 'Two'),
                           (5, 'Three'),
                           (6, 'Three')

问题

注意:这只是一个示例,将查询放在存储过程中似乎很容易,但这只是为了说明我想要做什么。在实时情况下,它不像这个例子那么容易。

目前我希望通过 productId 收集几个产品我必须这样做:

declare @l IntListType
insert into @l values(1),(2) 
exec TestProc @l

或声明@l IntListType insert into @l select ProductId from Products where Name = 'One' exec TestProc @l

我想知道是否可以跳过声明部分并将选择结果创建为 IntListType。我试图用“With”来做到这一点

exec TestProc (;with A as( select ProductId from Products where Name = 'One') select * from a)

但我无法完成这项工作。

是否有可能我正在尝试做,或者,如果我使用用户定义的表类型,我是否总是需要在它起作用之前声明和填充它?

4

1 回答 1

1

很抱歉让您失望,但尽管如此,目前 SQL Server 甚至不允许将简单的计算作为参数传递给过程。因此,它也不允许传入查询。

附带说明,IN不应该与子查询一起使用,因为这有时会导致性能问题。改为使用EXISTS或直接使用JOIN.

于 2013-02-01T15:05:09.213 回答