重用 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 表变量或克隆其结构的主要内容,如果未能解决你的问题,请参考以下文章