SQL语句怎么同时往两个表中插入不同的记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句怎么同时往两个表中插入不同的记录相关的知识,希望对你有一定的参考价值。

参考技术A

1、首先准备两个数据表,如下图所示,结构需要一样。

2、接着往第一个数据表先插入一些数据。

3、然后我们打开第二个数据表,这时你看到第二个里面是没数据的,我们需要将第一个中的插入进来。

4、接着编写插入语句,注意这次直接在insert后面用select获取数据。

5、然后我们就可以看到第二个数据表中有数据了。

6、最后在进行select查询数据的时候还可以用where进行筛选。

如何在 SQL 服务器中将数据插入到两个不同的表中,同时在 SQL 中具有 ORDER# 主键

【中文标题】如何在 SQL 服务器中将数据插入到两个不同的表中,同时在 SQL 中具有 ORDER# 主键【英文标题】:How can I insert data in SQL server to two different tables while having a ORDER# primary key in SQL 【发布时间】:2021-11-07 03:32:17 【问题描述】:

我想从 VB.net 将数据插入到 SQL Server 中的两个不同表中。 我在 SQL 中设置了身份增量,这是 order# 的​​来源。其余数据来自 vb.net。另一个问题是,每次我捕获订单时,从 Order 表中的所有内容都会复制到 Order Details 表中,这会导致大量不必要的重复行。 这是我目前在 VB 中的代码:

   Private Sub btnGetTotal_Click(sender As Object, e As EventArgs) Handles btnGetTotal.Click

    Dim connection As SqlConnection = New SqlConnection("x")

    Dim cmd As New Data.SqlClient.SqlCommand
    cmd.CommandText = "INSERT INTO [dbo].[Ordenes_5]([Sub_Total]) VALUES (@SubTotal)"

    cmd.Parameters.Add("@SubTotal", SqlDbType.VarChar).Value = lbltotal.Text
    connection.Open()
    cmd.Connection = connection
    cmd.ExecuteNonQuery()
    connection.Close()

    Dim icmd As SqlCommand = New SqlCommand("insert into ordenes_5_details (Orden#) select Orden# from Ordenes_5", connection)
    connection.Open()
    icmd.ExecuteNonQuery()
    connection.Close()

    Dim command As New Data.SqlClient.SqlCommand

    command.CommandText = "INSERT INTO dbo.Ordenes_5_details (Articulo, Cantidad, Precio) VALUES (@Articulo, @Cantidad, @Precio)"

    command.Parameters.Add("@Articulo", SqlDbType.VarChar)
    command.Parameters.Add("@Cantidad", SqlDbType.Int)
    command.Parameters.Add("@Precio", SqlDbType.Float)


    connection.Open()
    command.Connection = connection

    For i As Integer = 0 To DataGridView1.Rows.Count - 1

        command.Parameters(0).Value = If(DataGridView1.Rows(i).Cells(0).Value, DBNull.Value)
        command.Parameters(1).Value = If(DataGridView1.Rows(i).Cells(1).Value, DBNull.Value)
        command.Parameters(2).Value = If(DataGridView1.Rows(i).Cells(2).Value, DBNull.Value)


        command.ExecuteNonQuery()

    Next

    MsgBox("se capturo en ambas tablas")
    connection.Close()


End Sub

这些是我在 SQL Server 中的结果:

订单表。 Orden# 是该表中的 PRIMARY KEY。

Orden# Sub_Total
1015 $11.28

订单详情表。 Orden# 是外键。

Orden# Articulo Cantidad Precio
1015 NULL NULL NULL
NULL BURRITO 3 6.9
NULL COOKIE 4 3.96

这就是我要找的:

订单表

Orden# Sub_Total
1015 $11.28

订单明细表

Orden# Articulo Cantidad Precio
1015 BURRITO 3 6.9
1015 COOKIE 4 3.96

【问题讨论】:

这能回答你的问题吗? SQL add data to two tables at once using VB.NET command.Parameters.Add("@Cantidad", SqlDbType.VarChar) 你被告知这是个问题;学会正确地参数化。您的第一个 INSERT 根本没有参数化。养成良好的习惯 - 始终如一地编写代码。 @SMor 那里我只是为你改变了它,因为我很感激你照顾我们的初学者。 @SMor 我一直在尝试使用SCOPE_IDENTITY(),我收到此错误:“无法将参数值从字符串转换为 Int32。”现在,我的 Order 表中也多了一行。奥登# 1015 |小计 11.28,Orden# 1016 |小计 11.28。如何正确实施? 另外,您可能希望避免在货币列中使用float,因为这会导致总计错误,参考:float and real (Transact SQL) 用于浮点数字的近似数字数据类型数据。浮点数据是近似的;因此,并非数据类型范围内的所有值都可以准确表示。 【参考方案1】:

Order/Order Detail 模式在数据库工作中非常常见,因此您需要熟悉它。有几种方法可以解决这个问题。我将演示一种方法。

您已经在 cmets 中提醒您,数据库中的货币金额字段应该是十进制的。

ConnectionCommand 这样的数据库对象使用非托管代码。为了释放这些资源,这些库的架构师提供了Dispose 方法。 .Net 为 vb.net 提供了Using...End Using 块来关闭和处置对象。您可以使用逗号将多个对象组合在一个 Using 块中。

您可以将CommandTextConnection 直接传递给Command 的构造函数。我在第一个 Insert 语句中添加了额外的一行。这是和输出参数。我们将参数添加到参数集合并设置Direction。在Command被执行后取回值。

第二个插入现在可以将字段 Oden# 和一个参数 @OrderID 添加到 VALUES 列表中。我们将Value 设置为NewOrderID,因为每次执行命令时都相同。

由于我添加了一个参数,我在For循环中更改了Parameters的索引。

Private Sub btnGetTotal_Click(sender As Object, e As EventArgs) Handles btnGetTotal.Click
    Dim sql = "INSERT INTO [dbo].[Ordenes_5]([Sub_Total]) VALUES (@SubTotal);
                Set @ID = SCOPE_IDENTITY();"
    Dim NewOrderID As Integer
    Using connection As New SqlConnection("x"),
            cmd As New SqlCommand(sql, connection)
        cmd.Parameters.Add("@SubTotal", SqlDbType.Decimal).Value = CDec(lbltotal.Text)
        cmd.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output
        connection.Open()
        cmd.ExecuteNonQuery()
        NewOrderID = CInt(cmd.Parameters("ID").Value)
    End Using

    sql = "INSERT INTO dbo.Ordenes_5_details (Oden#, Articulo, Cantidad, Precio) VALUES (@OrderID, @Articulo, @Cantidad, @Precio)"
    Using cn As New SqlConnection("Your connection string"),
            cmd As New SqlCommand(sql, cn)
        cmd.Parameters.Add("@OrderId", SqlDbType.Int).Value = NewOrderID
        cmd.Parameters.Add("@Articulo", SqlDbType.VarChar)
        cmd.Parameters.Add("@Cantidad", SqlDbType.Int)
        cmd.Parameters.Add("@Precio", SqlDbType.Decimal)
        cn.Open()
        For i As Integer = 0 To DataGridView1.Rows.Count - 1
            cmd.Parameters(1).Value = If(DataGridView1.Rows(i).Cells(0).Value, DBNull.Value)
            cmd.Parameters(2).Value = If(DataGridView1.Rows(i).Cells(1).Value, DBNull.Value)
            cmd.Parameters(3).Value = If(DataGridView1.Rows(i).Cells(2).Value, DBNull.Value)
            cmd.ExecuteNonQuery()
        Next
    End Using
    MessageBox.Show("se capturo en ambas tablas")
End Sub

【讨论】:

以上是关于SQL语句怎么同时往两个表中插入不同的记录的主要内容,如果未能解决你的问题,请参考以下文章

插入数据库表中一条记录同时也插入另一个表中的SQL语句怎么写

怎么在Java中往数据库表插入新的内容

怎么往MySQL数据库里插入时间记录?就是简单的SQL语句,一句话的例子!谢谢了

如何用SQL语句删除两个表中相同的记录?

SQL语句 存在就更新不存在就插入

如何在 SQL 服务器中将数据插入到两个不同的表中,同时在 SQL 中具有 ORDER# 主键