【问题标题】:Insert all values of a table into another table in SQLSQL 将一个表的所有值插入到另一个表中
【发布时间】:2010-10-09 06:04:17
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    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 应该没问题。

    【讨论】:

    • 什么——?有人想给我留言,解释为什么这篇文章会产生反对票?我在 OPs 问题中没有看到任何指定新表应作为查询的一部分创建的内容。
    • 如何处理违反完整性约束的问题?例如,如果一个唯一的重复是停止查询还是跳过该特定条目?
    • 我相信它会抛出错误并回滚事务,这意味着没有任何内容被复制。不过值得测试。
    【解决方案2】:

    试试这个:

    INSERT INTO newTable SELECT * FROM initial_Table
    

    【讨论】:

    • 当我们有标识列时使用星星时不起作用
    • 对于这种带有身份的场景,首先添加 SET IDENTITY_INSERT table_name ON 并在末尾添加相同的 off 以插入身份值。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      来自here:

      SELECT *
      INTO new_table_name [IN externaldatabase] 
      FROM old_tablename
      

      【讨论】:

      • 这将创建一个新表。他已经有一张现有的桌子。
      【解决方案5】:

      您可以使用select into 语句。 See more at W3Schools.

      【讨论】:

        【解决方案6】:

        有一种更简单的方法,您无需输入任何代码(非常适合测试或一次性更新):

        第一步

        • 在资源管理器中右键单击表格并选择“编辑前 100 行”;

        第 2 步

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

        第 3 步

        • 针对目标表执行第 1 步。

        第四步

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

        第 5 步

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

        注意 - 1:如果列的顺序与目标表中的顺序不正确,您始终可以按照步骤 2,并按照与目标表中相同的顺序选择列 p>

        注意 - 2 - 如果你有身份列然后执行SET IDENTITY_INSERT sometableWithIdentity ON然后按照上面的步骤,最后执行SET IDENTITY_INSERT sometableWithIdentity OFF

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

            【解决方案8】:

            我认为这句话可能会如你所愿。

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

            【讨论】:

              【解决方案9】:
               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")
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-11-25
                • 2012-03-06
                • 2014-07-29
                • 2015-03-21
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多