插入行并增加字段中的值

Posted

技术标签:

【中文标题】插入行并增加字段中的值【英文标题】:insert rows and increase a value in a field 【发布时间】:2015-06-24 07:13:13 【问题描述】:

我在从一个表插入到另一个表时遇到问题: 我想从另一个表中插入多行,并在插入时增加目标表中 int 字段的值。 代码是这样的:

 Dim sqlCmd As New SqlClient.SqlCommand()
        Dim conMain As New SqlClient.SqlConnection()

    Dim strSQL As String = 
"INSERT INTO AvizeCorn 
(Seria, DataMAx, NrAviz, Agent, Școala, Data, 
Buc, ZileLivrare, Luna, Produs, Anul) 
SELECT @Seria, @Data+Zile as DataMax, @NrAviz, Agent, Școala, @Data, Zile*BucSt as Buc, 
Zile as ZileLivrare, @Luna, @Produs,@Anul 
FROM AgențiȘcoliCorn"

    Try
        conMain.ConnectionString = "Data Source=cristib\sqlexpress;Initial Catalog=Avize Măr și Corn;Integrated Security=True"
        sqlCmd.Connection = conMain
        conMain.Open()
        sqlCmd.CommandType = CommandType.Text
        sqlCmd.CommandText = strSQL

        With sqlCmd.Parameters

            .AddWithValue("@Seria", "AGP")
            .AddWithValue("@NrAviz", DataSetCorn.AvizeCorn.Compute("Max(NrAviz)", "") + 1)
            .AddWithValue("@Data", Convert.ToDateTime(DataCorn.Text))
            .AddWithValue("@Luna", MonthName(Month(DataCorn.Text)))
            .AddWithValue("@Produs", Produs.Text)
            .AddWithValue("@Anul", Year(DataCorn.Text))

        End With

        sqlCmd.ExecuteNonQuery()
        conMain.Close()
        MsgBox("Avizele au fost create cu succes.")

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

我的问题是NrAviz

我想检查最大值并为表中插入的每一行增加 1。 使用我的代码,它为表中插入的每个新行插入相同的值。

请帮忙,因为我是 sql 和 vb.net 的新手

【问题讨论】:

表格中有多少行 您最好使用 IDENTITY 或 SEQUENCE。计算这样的序列 a) 可能无法在多用户环境中工作,并且 b) 将是资源密集型的。你需要它做什么? 在这个新表中,我需要增加一个字段 (NrAviz),因为它就像一个 ID 字段。但我需要它与我的表中已经存在的 ID 字段不同,它是身份。序列呢?怎么用? 【参考方案1】:

您可以将Max(NrAviz) 放入正在获取记录以插入它们的 SELECT 中。你可以使用ROW_NUMBER

Dim sqlCmd As New SqlClient.SqlCommand()
Dim conMain As New SqlClient.SqlConnection()

       Try
        conMain.ConnectionString = "Data Source=cristib\sqlexpress;Initial Catalog=Avize Măr și Corn;Integrated Security=True"
        sqlCmd.Connection = conMain
        conMain.Open()
        sqlCmd.CommandType = CommandType.Text
        sqlCmd.CommandText = strSQL


        Dim strSQL As String = "INSERT INTO AvizeCorn (Seria, DataMAx, NrAviz, Agent, Școala, Data, 
Buc, ZileLivrare, Luna, Produs, Anul) 
SELECT @Seria, @Data+Zile as DataMax, (SELECT MAX(NrAviz) from AvizeCorn) + row_number() over (order by ID), Agent, Școala, @Data, Zile*BucSt as Buc, 
Zile as ZileLivrare, @Luna, @Produs,@Anul 
FROM AgențiȘcoliCorn"

        sqlCmd.CommandText = strSQL

        With sqlCmd.Parameters

            .AddWithValue("@Seria", "AGP")
            .AddWithValue("@Data", Convert.ToDateTime(DataCorn.Text))
            .AddWithValue("@Luna", MonthName(Month(DataCorn.Text)))
            .AddWithValue("@Produs", Produs.Text)
            .AddWithValue("@Anul", Year(DataCorn.Text))

        End With

        sqlCmd.ExecuteNonQuery()
        conMain.Close()
        MsgBox("Avizele au fost create cu succes.")

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

编辑

你也可以试试

INSERT INTO AvizeCorn (Seria, DataMAx, NrAviz, Agent, Școala, Data, Buc, ZileLivrare, Luna, Produs, Anul) 
SELECT @Seria, @Data+Zile as DataMax, MAX(NrAviz)+1 FROM AvizeCorn, Agent, Școala, @Data, Zile*BucSt as Buc, Zile as ZileLivrare, @Luna, @Produs,@Anul 
FROM AgențiȘcoliCorn

【讨论】:

更好的方法......但现在它说“无效的列名“NrAviz”。 那么NrAviz 不是AgențiȘcoliCorn 表上的列。 Nraviz 列所属的表名是什么?是AvizeCorn吗? AvizeCorn。好的。我确实修改了它,但现在我在开始时的位置。它插入 2 行具有相同的 NRAviz 值。最大+1。不会增加下一行的值。 我已经更新了从AvizeCorn 表中检索Max(NrAviz) 的答案 插入第一行后如何重新查询最大值然后加1?

以上是关于插入行并增加字段中的值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL - 重复行并更新表中的列

遍历 pandas 行并根据其他列中的值设置列值

Oracle 删除表中的重复行并使用另一个表中的值更新行

如何遍历数据框的行并检查列行中的值是不是为 NaN

在另一个表中插入一行时如何自动增加一个表中的值

根据使用 Javascript 选择的组合框动态添加表单字段