复制 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 列。我不需要将这些数据添加到列的查询,只需添加裸列即可。
【问题讨论】:
column4
和 column5
中的数字来自哪里?
【参考方案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 表并添加列是不是正常? [关闭]
SQL Server 2016 可以在一个事务中重新排列多个查询的顺序吗?
SQL server初级SQL SERVER Transactional Replication中添加新表如何不初始化整个快照