代码
CREATE TYPE [dbo].[IntListType] AS TABLE([Number] [int] NULL)
DECLARE @ids as IntListType;
DECLARE @TempIds as IntListType;
场合
我有很长的产品清单,需要在存储过程中进行过滤。过滤器以用户定义的表类型给出,每个过滤器可以为空或满。我试图为此创建一个查询,但如果其中一个过滤器为空,它将无效。
所以我决定创建另一个用户定义的表类型,它只包含列:Number。
然后,对于每种过滤器类型,它将检查它是否为空
IF (select filterName from @customtable) is not null
如果是这样,它将查询与该名称匹配的产品ID,并将其添加到数字列表中。
如果下一个过滤器不是emmpty,它会将id添加到临时表中,而临时表又将与第一个表合并。
到目前为止,我发现这是处理过滤器是否为空的最有效方法。无论如何,它将获得我需要的id!
现在,每个过滤器最终都会执行以下代码:
IF (select count(*) from @ids) > 0
BEGIN
IF(select count(*) from @TempIds)
BEGIN
delete from @ids
where Number not in
(select C.Number
from @ids C
inner join @TempIds T on C.Number = T.Number)
END
END
ELSE
BEGIN
insert into @ids
select * from @TempIds
END
delete from @TempIds
问题
我正在寻找一种方法将最后一个命名代码实现到一个存储过程中,它给我一个IntListType列表。但是,我对@ids(declare @ids as IntListType) can't be set. (asin
设置@ids = @TempIds'>的每个实现都会抱怨'必须声明标量变量@ids'以及'@TempIds')
我该如何解决这个问题?
尝试
我已经尝试通过将每个表与内连接,外连接和其他连接组合来跳过这一切..但是当任何(或所有)过滤器为空时,我绝不会得到相同的结果。< / p>
据我所知,这是有效推进每种过滤器类型的唯一方法,检查它们是否为空,如果没有;处理结果等等
答案 0 :(得分:0)
在您共享的查询部分中,没有声明@ids或@TempIds。 你可以添加那部分吗?
除此之外,我认为您不应该关注用户定义的类型:Can T-SQL function return user-defined table type?
查看用户定义的函数: