将表的所有值插入SQL中的另一个表


128

我正在尝试将一个表的所有值插入另一个表。但是insert语句接受值,但是我希望它接受initial_Table中的select *。这可能吗?

Answers:


262

insert语句实际上具有用于执行此操作的语法。如果指定列名而不是选择“ *”,则容易得多:

INSERT INTO new_table (Foo, Bar, Fizz, Buzz)
SELECT Foo, Bar, Fizz, Buzz
FROM initial_table
-- optionally WHERE ...

我最好弄清楚这一点,因为出于某种原因,该帖子获得了一些否决权。

INSERT INTO ... SELECT FROM语法适用于您要插入的表(在上面的示例中为“ new_table”)已经存在的情况。就像其他人所说的那样,SELECT ... INTO语法适用于您要在命令中创建新表的情况。

您没有指定是否需要在命令中创建新表,因此如果目标表已经存在,则INSERT INTO ... SELECT FROM应该没问题。


3
哇-?有人想给我留下评论,解释为什么这篇文章产生了反对票吗?我在OPs问题中看不到任何指定新表应作为查询的一部分创建的内容。
马特·汉密尔顿

这如何处理违反完整性约束的问题?例如,如果重复的唯一性会导致查询停止还是仅跳过该特定条目?
Martin Dale Lyness

我相信它将引发错误并回滚事务,这意味着不会复制任何内容。虽然值得测试。
马特·汉密尔顿,2009年

25

试试这个:

INSERT INTO newTable SELECT * FROM initial_Table

2
当我们使用标识列时使用星星时不起作用
Mohsen Tavoosiمحسنطاوسی

对于具有标识的这种情况,请首先将SET IDENTITY_INSERT table_name添加为ON,然后将其最后添加为OFF,以插入标识值。
胡安

13

您可以使用子查询插入,如下所示:

INSERT INTO new_table (columns....)
SELECT columns....
FROM initial_table where column=value



4

有一种简便的方法,您无需键入任何代码(理想的测试或一次性更新):

第1步

  • 右键单击资源管理器中的表格,然后选择“编辑前100行”;

第2步

  • 然后,您可以选择所需的行(Ctrl +单击Ctrl + A),然后右键单击并复制(注意:如果要添加“ where ”条件,请右键单击网格->窗格-> SQL Now)您可以编辑查询并添加WHERE条件,然后再次右键单击->执行SQL,将在底部选择所需的行)

第三步

  • 按照步骤1的目标表。

第4步

  • 现在转到网格的末尾,最后一行的第一列将带有一个星号(*)(此行用于添加新条目)。单击该按钮以选择整个行,然后单击粘贴(Ctrl + V)。该单元格可能有一个红色的Asterix(表明它没有保存)

第5步

  • 单击任何其他行以触发插入语句(红色Asterix将消失)

注意-1:如果列的排列顺序与目标表中的排列顺序不正确,则始终可以按照步骤2进行操作,并按照与目标表中相同的顺序选择列

注意-2-如果您有“身份”列,请执行然后执行SET IDENTITY_INSERT sometableWithIdentity ON上述步骤,最后执行SET IDENTITY_INSERT sometableWithIdentity OFF


3

如果您要永久传输大量数据,即不填充临时表,则建议使用SQL Server导入/导出数据进行表到表映射。

当您在映射中进行类型转换和可能的值截断时,导入/导出工具通常比直接SQL更好。通常,映射越复杂,使用诸如Integration Services(SSIS)之类的ETL工具而不是直接SQL的效率就越高。

导入/导出工具实际上是一个SSIS向导,您可以将工作另存为dtsx包。


2

我认为此声明可能会满足您的要求。

INSERT INTO newTableName (SELECT column1, column2, column3 FROM oldTable);

0
 Dim ofd As New OpenFileDialog
                ofd.Filter = "*.mdb|*.MDB"
                ofd.FilterIndex = (2)
                ofd.FileName = "bd1.mdb"
                ofd.Title = "SELECCIONE LA BASE DE DATOS ORIGEN (bd1.mdb)"
                ofd.ShowDialog()
                Dim conexion1 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd.FileName
                Dim conn As New OdbcConnection()
                conn.ConnectionString = conexion1
                conn.Open()



            'EN ESTE CODIGO SOLO SE AGREGAN LOS DATOS'
            Dim ofd2 As New OpenFileDialog
            ofd2.Filter = "*.mdb|*.MDB"
            ofd2.FilterIndex = (2)
            ofd2.FileName = "bd1.mdb"
            ofd2.Title = "SELECCIONE LA BASE DE DATOS DESTINO (bd1.mdb)"
            ofd2.ShowDialog()
            Dim conexion2 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd2.FileName
            Dim conn2 As New OdbcConnection()
            conn2.ConnectionString = conexion2
            Dim cmd2 As New OdbcCommand
            Dim CADENA2 As String

            CADENA2 = "INSERT INTO EXISTENCIA IN '" + ofd2.FileName + "' SELECT * FROM EXISTENCIA IN '" + ofd.FileName + "'"


            cmd2.CommandText = CADENA2
            cmd2.Connection = conn2
            conn2.Open()
            Dim dA2 As New OdbcDataAdapter
            dA2.SelectCommand = cmd2
            Dim midataset2 As New DataSet
            dA2.Fill(midataset2, "EXISTENCIA")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.