是否有可能克隆"表变量?

时间:2018-04-06 16:22:58

标签: sql sql-server tsql

我有一个包含大约20列的表变量。我想基本上为2个不同的结果集重用单个表变量结构。 2个结果集应该用不同的表变量表示,这样我就不能重用单个表变量。因此,我想知道是否有办法克隆单个表变量以供重用。例如,像这样:

DECLARE @MyTableVar1 TABLE(
   Col1 INT,
   Col2 INT
}

DECLARE @MyTableVar2 TABLE = @MyTableVar1

如果我可以重用现有的SQL,我想避免创建重复的SQL。

4 个答案:

答案 0 :(得分:4)

这是不可能的,请改用临时表

if object_id('tempdb..#MyTempTable1') is not null drop table #MyTempTable1
Create TABLE #MyTempTable1 (
   Col1 INT,
   Col2 INT
)

if object_id('tempdb..#MyTempTable2') is not null drop table #MyTempTable2
select * into #MyTempTable2 from #MyTempTable1 

更新:

正如Eric在评论中所建议的那样,如果您只是寻找表模式而不是第一个表中的数据,那么

select * into #MyTempTable2 from #MyTempTable1 where 1 = 0

答案 1 :(得分:2)

您可以创建用户定义的表类型,通常用于为存储过程使用表值参数。创建类型后,您可以将其用作类型来声明任意数量的表变量,就像内置类型一样。这最接近你的要求。

例如:

CREATE TYPE MyTableType AS TABLE   
( COL1 int  
, COL2 int )

DECLARE @MyTableVar1 AS MyTableType
DECLARE @MyTableVar2 AS MyTableType

此解决方案需要注意的一些事项

  1. MyTableType成为数据库级别类型。它不是特定存储过程的本地。
  2. 如果必须更改表的定义,则必须使用TVP类型删除代码/ sprocs,然后使用新定义和相关的sprocs重新创建表类型。通常,这是一个非问题,因为代码和类型是一起创建/重新创建的。

答案 2 :(得分:1)

您可以使用临时表并选择...因为统计数据更好,所以效果更好。

create table #myTable(
   Col1 INT null,
   Col2 INT null
}

...

select * 
into #myTableTwo
from #myTable 

答案 3 :(得分:0)

您可以在表中创建一个表变量并添加type列,并使用查询中的type列来过滤数据。

通过这种方式,您使用一个表来保存多种类型的数据。 希望这会有所帮助。

declare @myTable table(
   Col1 INT null,
   Col2 INT null,
....
  Type INT NULL
}


insert into @myTable(...,type)
select ......,1

insert into @myTable(...,type)
select ......,2

select * from @myTable where type =1 
select * from @myTable where type =2