我正在编写存储过程来分页另一个存储过程的结果。我通过执行存储过程并将结果插入到表变量中来实现:
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 from @allresults where [DESCRIPTION] NOT like '%keyword%'
?另外,2k8中的CTE+ROW_NUMBER允许更有效的分页方法。 - Alex K.