存储过程偶尔会执行两次

时间:2014-08-28 14:36:01

标签: .net sql-server stored-procedures

我创建了一个.net控制台应用程序,它从计算机和/用户收集一些基本的库存信息。它通过存储过程将此信息转储到SQL Server 2012数据库中。

我偶尔会在至少两个表中出现重复记录。

存储过程非常简单,当存储过程收到序列号(以及其他参数)时,它会在资产表中搜索序列号。如果找到匹配项,则返回assetId,否则将创建新条目并返回新创建的assetId。同样在该过程中,使用先前返回的assetId将日期时间条目添加到事件表中。

我开始看到的是资产表中的两条记录,其中包含连续的assetId个数字,但具有相同的序列号。有趣的是,事件表中将有两条记录对应于具有完全相同assetId的这些date_time中的每一个。

在我们拥有的22,000多台计算机中,这只发生在五个序列号上,所以对我来说这不是世界末日。但是,由于这个问题,我对其他数据的可靠性提出了质疑。

任何想法如何发生?

存储过程

    --Create an asset row if there is not one and retrieve the id. Or just retrieve the id.
If (select count(assetid) from asset where serial=@serial) > 0
Begin
    set @assetid = (select top 1 assetid from asset where serial=@serial )
End
Else 
    --Add asset to table
    Begin
        Insert into asset (serial, model, manufacturer) 
        values (@serial, @model, @manufacturer);

        set @assetid = (Select SCOPE_IDENTITY())
    End
    --End Asset entry

    --Insert Audit Event record
    Insert into auditevent (assetid, audittime, username, computername, operatingsystem) 
    values (@assetid, @audittime, @username, @computername, @operatingsystem)

    Declare @auditeventid int = (select SCOPE_IDENTITY())

    --Send the ipString to the function that will convert it to a table and insert into IP Table
    Insert into ipaddress (auditeventid, ipaddress) 
        select * 
        from CsvToTable(@auditeventid, @ipaddressvalues)

控制台应用(单线程)

    Dim strExcutionCommand As String = "dbo.auditclient @computername=N'" & strComputerName & "',@modeltext=N'" & strModel & "',@serial=N'" & strSerialNumber & "',@username=N'" & strUserName & "',@manufacturertext=N'" & strManufacturer & "',@operatingsystemtext=N'" & strOperatingSystem & "',@ipaddressvalues=N'" & strNetAddress & "'"


    Dim Inv_ConnectString As String = "Data Source=cen-support01;Initial Catalog=IT_Inventory;User Id=" & strSqlUser & ";Password=" & strSqlPw & ";"
    Dim myConnection As SqlConnection = New SqlConnection(Inv_ConnectString)

    Dim myCommand As SqlCommand = New SqlCommand(strExcutionCommand, myConnection)
    myConnection.Open()
    myCommand.ExecuteNonQuery()
    myConnection.Close()

1 个答案:

答案 0 :(得分:0)

如果不查看控制台应用程序的代码以及运行方式的详细信息,就不容易诊断此问题。例如,您是否可以运行多个实例并且有2个线程同时尝试执行相同的任务?

当有要添加的库存项目并查看是否重复时,您可以通过运行控制台应用程序两次来测试这是否是原因。

存储过程的逻辑似乎很好,虽然我会稍微重写一下:

IF EXISTS (SELECT 1 FROM asset WHERE serial=@serial) 
   -- Create an asset row if it doesn't exist
    BEGIN
        SELECT @assetid = assetid FROM asset WHERE serial=@serial
    END
ELSE 
    --Add asset to table    
    BEGIN
        INSERT INTO asset (serial,model,manufacturer) 
        VALUES (@serial,@model,@manufacturer);

        SELECT @assetid = SCOPE_IDENTITY()
    END

这是未经测试的,但你应该明白这一点。