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

时间:2013-08-06 12:49:32

标签: sql-server tsql stored-procedures table-variable

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

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 个答案:

答案 0 :(得分: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