【问题标题】:Stored procedure inserts multiple duplicate rows存储过程插入多个重复行
【发布时间】:2016-02-12 08:08:59
【问题描述】:

我有这个存储过程:

ALTER PROCEDURE [dbo].[spInsertAttendanceDetail] 

@ConstituentIdNo nvarchar(15),
@AttendanceID nvarchar(15)


AS
BEGIN

   INSERT INTO tblAttendanceDetail (AttendanceID,ConstituentIdNo)
   VALUES (@AttendanceID,@ConstituentIdNo)

END

我使用 vb.net 脚本执行存储过程:

 For Each id As Object In Arguments.SelectedValues
 Using sql As New SqlProcedure("spInsertAttendanceDetail")
 sql.AddParameter("@ConstituentIdNo", constituentIdNo)
 sql.AddParameter("@AttendanceID", attendanceID)
 sql.ExecuteNonQuery()
 End Using
 Next

如果我从多个选择网格中选择三个记录,它会插入 9 个记录,如果我选择四个,它会插入 16 个记录,其中四个相同的值。有什么方法可以根据我选择的记录数插入记录,假设我从网格中选择三个记录,那么它也应该只插入三个记录?谢谢。

【问题讨论】:

  • 问题不在 SQL 端。您在 Arguments.SelectedValues 中有多少条记录?顺便说一句,您最好将创建过程的“使用”部分移出循环,创建 SqlProcedure 然后填充参数并在循环内执行。
  • 看起来你在每行触发的事件处理程序中编写了 FOR 循环
  • @Flicker 感谢您的回复和建议。我的网格中有大约 9,000 条记录。

标签: sql-server visual-studio


【解决方案1】:

您可以在您的程序中使用它:

   MERGE tblAttendanceDetail as target
   USING (SELECT AttendanceID,ConstituentIdNo 
            FROM (VALUES (@AttendanceID,@ConstituentIdNo))
            as t(AttendanceID,ConstituentIdNo)) as source
    ON targer.AttendanceID = source.AttendanceID 
        AND target.ConstituentIdNo = source.ConstituentIdNo
    WHEN NOT MATCHED THEN
        INSERT VALUES (source.AttendanceID,source.ConstituentIdNo)

它将帮助您消除重复数据。

但正如@FLICKER 在他的评论中所说,你应该:

创建SqlProcedure 然后填充参数并在里面执行 循环

也许这会有所帮助(vb.net):

For Each row As DataGridViewRow In Arguments.SelectedRows
    Using sql As New SqlProcedure("spInsertAttendanceDetail")
    sql.AddParameter("@ConstituentIdNo", row.Cells(0).Value)
    sql.AddParameter("@AttendanceID", row.Cells(1).Value)
    sql.ExecuteNonQuery()
    End Using
Next

【讨论】:

  • 不回答问题。它解决了问题,但同样可以通过截肢来治愈“头痛”。而是找出问题发生的原因,然后修复根源。
  • 不回答问题,但解决了部分问题:)
  • 是的,让我们确保将技术问答网站变成免费的代码编写服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2020-07-10
  • 2014-03-06
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多