重用 t-sql 表变量或克隆其结构

Posted

技术标签:

【中文标题】重用 t-sql 表变量或克隆其结构【英文标题】:Reuse t-sql table variable or clone its structure 【发布时间】:2013-08-06 12:49:32 【问题描述】:

我正在编写存储过程来对不同存储过程的结果进行分页。我通过执行存储过程并将结果插入表变量来做到这一点:

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 允许更有效的分页方法 可以反转过滤器子句。不确定这样做的性能。有了这个解决方案,我根本不需要第二个变量。它确实有助于避免问题。过滤后,我实际上使用 ROW_NUMBER 进行分页,但我使用子查询(因为我发现 CTE 可怕且难以理解;)。 【参考方案1】:

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

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

【讨论】:

这将有助于重复。创建后,此类型属于创建它的数据库还是在数据库之间共享? 来自 MSDN:在当前数据库中创建别名数据类型或用户定义类型。

以上是关于重用 t-sql 表变量或克隆其结构的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 复制表变量

在 T-SQL 中将变量表与单个变量结合起来

我可以遍历 T-SQL 中的表变量吗?

我可以在T-SQL中循环表变量吗?

在 T-SQL 中,如何在子查询中引用表变量?

如何在这个特定的 T-SQL 查询中使用表变量?