我需要复制 atable (不复制数据),然后将其移动到不同的文件组。类似于以下内容(这对我不起作用)。
SELECT * INTO NewTable ON [FG_newFilegroup] FROM oldTable WHERE 1=0
我需要复制 atable (不复制数据),然后将其移动到不同的文件组。类似于以下内容(这对我不起作用)。
SELECT * INTO NewTable ON [FG_newFilegroup] FROM oldTable WHERE 1=0
SELECT INTO 方法不会将约束、外键或索引复制到新表。要做到这一点是一项重大的努力。
另一种策略是通过在目标文件组上重建表的聚集索引来仅移动表的主要数据。
您可以在 之前更改默认文件组select into
,并在之后重置它:
select 41 as i into newtable1
alter database test modify filegroup [secondary] default
select 41 as i into newtable2
alter database test modify filegroup [primary] default
select t.name as TableName
, f.name as Filegroup
from sys.tables t
join sys.indexes i
on t.object_id = i.object_id
join sys.filegroups f
on f.data_space_id = i.data_space_id
where t.name like 'newtable%'
这打印:
TableName Filegroup
newtable1 PRIMARY
newtable2 SECONDARY
使用它来创建一个没有数据的新表:
从 OldTable 中选择 TOP 0 * INTO NewTable
如果您还想要数据,请删除TOP 0 。之后你可以对新表做任何事情。
你应该这样写:
INSERT INTO NewTable
SELECT * FROM oldTable WHERE 1 = 0
请注意,您在查询中编写的表达式始终为 false,因此不会从第二个语句1 = 0
返回任何行。SELECT
因此,这将导致根据查询的 SELECT 子句中的列创建一个空表,并且不会将第二个表中的数据复制到新创建的表中。要复制数据,您还需要在WHERE
子句中提供一个真正的表达式,例如WHERE 1 = 1
.