Sql 用户定义的表类型参数

Sql 用户定义的表类型参数,sql,user-defined-types,Sql,User Defined Types,代码 处境 我有一长串需要在存储过程中过滤的产品。过滤器是以用户定义的表类型提供的,每个过滤器可以是空的,也可以是满的。我试图为此创建一个查询,但如果其中一个筛选器为空,则该查询将不起作用 所以我决定创建另一个用户定义的表类型,它只包含列:Number 然后,对于每种过滤器类型,它将检查是否为空 如果从@customtable中选择filterName不为null 如果是这样,它将查询与该名称匹配的产品Id,并将其添加到数字列表中 如果下一个过滤器不是emmpty,它将把id添加到临时表中,临时

代码

处境

我有一长串需要在存储过程中过滤的产品。过滤器是以用户定义的表类型提供的,每个过滤器可以是空的,也可以是满的。我试图为此创建一个查询,但如果其中一个筛选器为空,则该查询将不起作用

所以我决定创建另一个用户定义的表类型,它只包含列:Number

然后,对于每种过滤器类型,它将检查是否为空 如果从@customtable中选择filterName不为null 如果是这样,它将查询与该名称匹配的产品Id,并将其添加到数字列表中

如果下一个过滤器不是emmpty,它将把id添加到临时表中,临时表又将与第一个表合并

到目前为止,我发现这是处理筛选器是否为null的最有效方法。无论如何它都能得到我需要的身份证

现在,每个过滤器最终将执行以下代码:

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的每个实现都将@ids声明为IntListType。asinset@ids=@TempIds'>将抱怨“必须声明标量变量@ids”以及“@TempIds”

我怎样才能解决这个问题

尝试

我已经尝试通过将每个表与内部联接、外部联接和其他联接相结合来跳过这一切。。但是,当任何或所有过滤器都为空时,我将无法获得相同的结果


就我所见,这是有效改进每种过滤器类型的唯一方法,检查它们是否为null,如果不是;处理结果等

在您共享的查询部分,没有@ids或@TempIds的声明。 你能加上那部分吗

除此之外,我认为您不应该查看用户定义的类型:

查看用户定义的函数:


我不知道函数如何返回一个列表,在返回列表之后,该函数可以再次更改相同的列表。
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