2016-02-12 27 views
0

我有这个存储过程:存储过程插入多重复的行

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条记录,如果我选择4条记录,则会插入16条记录,其中四条记录的值相同。有没有什么方法可以根据我选择的记录数来插入记录让我们说如果从网格中选择三条记录,那么它应该只插入三条记录?谢谢。

+2

问题不在SQL端。在Arguments.SelectedValues中有多少条记录?顺便说一句,你最好移动“使用”部分,在你创建一个过程的地方,创建SqlProcedure,然后填充参数并在循环内部执行。 – FLICKER

+0

看起来像你写道,在每行触发的事件处理程序中的FOR循环 –

+0

@闪烁感谢您的答复和建议。我的网格中有大约9,000条记录。 –

回答

0

你可以在你的程序中使用此:

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 
+0

不回答问题。它解决了这个问题,但同样的方式可以通过截肢头部来治疗“头痛”。而是找出问题出现的原因,然后解决问题。 – TomTom

+0

不回答问题,但修复了问题的一部分:) – gofr1

+0

是的,让我们确保将技术问答网站变成免费的代码写入服务。 – TomTom