重复使用 t-sql 表变量还是克隆其结构?

3

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

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],
    ...
);

有没有办法做到这一点?也许有一种克隆表变量的方法?我猜可以使用带有输出子句的删除命令实现同时删除和过滤,但我不确定应该如何编写。

我不想重复代码。也许你知道一个简单的解决方案 :)


1
你能否反转过滤条件吗?delete from @allresults where [DESCRIPTION] NOT like '%keyword%'?另外,2k8中的CTE+ROW_NUMBER允许更有效的分页方法。 - Alex K.
反转过滤条件是可行的。不确定这样做的性能如何。使用此解决方案,我根本不需要第二个变量。它确实有助于避免问题。在过滤后,我实际上使用子查询来使用ROW_NUMBER进行分页,因为我发现CTE很可怕且难以理解 ;)。 - slawek
1个回答

2

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

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

那会有助于重复。创建后,该类型属于创建它的数据库,还是在多个数据库之间共享? - slawek
2
从MSDN:在当前数据库中创建别名数据类型或用户定义类型。 - GriGrim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接