用户定义的表类型参数

Posted

技术标签:

【中文标题】用户定义的表类型参数【英文标题】:User-Defined Table Type parameter 【发布时间】:2013-01-18 14:19:28 【问题描述】:

代码

CREATE TYPE [dbo].[IntListType] AS TABLE([Number] [int] NULL)
DECLARE @ids as IntListType;
DECLARE @TempIds as IntListType;    

情况

我有一长串需要在存储过程中过滤的产品。过滤器作为用户定义的表类型给出,每个过滤器可以为空或已满。我已尝试为此创建一个查询,但如果其中一个过滤器为空,它将无法工作。

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

然后,对于每个过滤器类型,它会检查它是否为空 IF (select filterName from @customtable) is not null 如果是,它将查询与该名称匹配的产品 ID 并将其添加到数字列表中。

如果下一个过滤器不是空的,它会将 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. (asinset @ids = @TempIds' > 都会抱怨'必须声明标量变量@ids'以及'@TempIds')

我该如何解决这个问题?

尝试

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

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

【问题讨论】:

【参考方案1】:

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

除此之外,我认为您不应该查看用户定义类型:Can T-SQL function return user-defined table type?

看看用户定义的函数:

http://www.sqlteam.com/article/user-defined-functions http://blog.sqlauthority.com/2007/05/29/sql-server-user-defined-functions-udf-limitations/ tsql returning a table from a function or store procedure

【讨论】:

我看不出函数如何返回一个列表,之后该函数可以再次更改相同的列表。

以上是关于用户定义的表类型参数的主要内容,如果未能解决你的问题,请参考以下文章

如何制作一个以用户定义的表类型为参数并在sql中返回相同的函数?

用户定义表类型的缓冲区格式

用户定义的表类型是否拒绝EXECUTE权限?

EF Core 使用许多用户定义的表类型执行过程

用户定义的表类型,其Id为Identity(1,1)

MsSQL 未使用 sp_executesql 传递用户定义的表类型