我正在编写存储过程以分页另一个存储过程的结果。我通过执行存储过程并将结果插入表变量中来实现:

DECLARE @allResults table
(
    [ID] [int] NOT NULL,
    [DESCRIPTION] [varchar](MAX) NULL,
    [COL1] [VARCHAR],
    [COL2] [VARCHAR],
    ...
);

INSERT @allResults Exec [dbo].[GetResults];


我需要过滤结果并将它们存储在某个地方,因为我将在至少两个地方使用过滤后的结果:计算所有记录并进行实际分页。理想情况下,我想重用@allResults表,因为过滤后不再需要其内容。类似于:

@allresults = @allresults where [DESCRIPTION] like '%keyword%'


我不确定如何在过滤表的同时截断表。这就是为什么我创建第二个具有相同结构的表变量的原因:

DECLARE @filteredResults table
(
    [ID] [int] NOT NULL,
    [DESCRIPTION] [varchar](MAX) NULL,
    [COL1] [VARCHAR],
    [COL2] [VARCHAR],
    ...
);


这不是一个不好的解决方案,并且可以工作。但是我想知道是否可以重用表变量的定义?看起来像这样:

DECLARE @filteredResults, @allResults table
(
    [ID] [int] NOT NULL,
    [DESCRIPTION] [varchar](MAX) NULL,
    [COL1] [VARCHAR],
    [COL2] [VARCHAR],
    ...
);


有办法吗?也许有一种方法可以克隆表变量?我猜可以通过使用带有输出子句的delete来实现同时删除和过滤,但是我不确定该如何写。

我讨厌重复代码。也许您知道一个简单的解决方案:)

最佳答案

您可以创建自己的用户表类型:

CREATE TYPE dbo._t_test AS TABLE(
    [ID] [int] NOT NULL,
    [DESCRIPTION] [varchar](MAX) NULL,
    [COL1] [VARCHAR],
    [COL2] [VARCHAR]
)
GO


然后创建表变量,如下所示:

DECLARE @filteredResults dbo._t_test
    , @allResults dbo._t_test

09-26 23:13