复制 SQL Server 表并添加和重新排列列

Posted

技术标签:

【中文标题】复制 SQL Server 表并添加和重新排列列【英文标题】:Copying a SQL Server table and adding and rearranging columns 【发布时间】:2015-11-20 18:00:19 【问题描述】:

我知道如果我想复制一个 SQL Server 表,我可以写一个类似这样的查询:

SELECT * 
INTO NewTable
FROM OldTable

但是如果我想获取可能看起来像这样的OldTable 的内容怎么办:

| Column1 | Column2 | Column3 |
|---------|---------|---------|
| 1       | 2       | 3       |
| 4       | 5       | 6       |
| 7       | 8       | 9       |

并复制该表,但新表如下所示:

| Column1   | Column3   | Column2   | Column4   | Column5   |
|---------  |---------  |---------  |---------  |---------  |
| 1         | 3         | 2         | 10        | 11        |
| 4         | 6         | 5         | 12        | 13        |
| 7         | 9         | 8         | 14        | 15        |

所以现在我已经交换了第 2 列和第 3 列,并添加了第 4 列和第 5 列。我不需要将这些数据添加到列的查询,只需添加裸列即可。

【问题讨论】:

column4column5 中的数字来自哪里? 【参考方案1】:

这是修改您的选择语句的问题。 SELECT * 仅按顺序从源表中获取列。你想要一些不同的东西 - 所以SELECT它。

SELECT * INTO NewTable
  FROM OldTable

->

SELECT Col1, col3, col2, ' ' AS col4, ' ' AS col5
  INTO NewTable
  FROM OldTable

就表的列的指定方式和索引等而言,这给您带来的灵活性很小 - 所以这可能是个坏主意,最好以另一种方式(正确地CREATE TABLE)这样做,但如果您需要快速和脏,我想...

【讨论】:

如果您希望它们为数字或适当地指定它们(在 SELECT 规范的限制内),显然选择 NULL 作为 col4/col5。 CREATE TABLE 怎么比这种方式好?这会将所有旧数据直接放入表中。 CREATE TABLE 在索引和键等方面有比这更多的选项。据我所知,无论如何......【参考方案2】:

您可以只命名列:

Select
[Column1], [Column3], [Column2], Cast(null as bigint) as [Column4], 0 as [Column5]
Into CopyTable
From YourTable

就像任何查询一样,最好使用列名并避免使用*

然后您可以在选择中添加任何值as [ColumnX]。 您可以使用强制转换在新表中获取您想要的类型。

【讨论】:

以上是关于复制 SQL Server 表并添加和重新排列列的主要内容,如果未能解决你的问题,请参考以下文章

为 SQL Server 抓取数据时更改 mySQL 表并添加列是不是正常? [关闭]

django 在 SQL Server 中指定列排列

SQL Server 2016 可以在一个事务中重新排列多个查询的顺序吗?

SQL server初级SQL SERVER Transactional Replication中添加新表如何不初始化整个快照

如何修改SQL Server2005排序规则

使用R(DBI包)从SQL Server表中删除行