日期:2014-05-17  浏览次数:20617 次

帮我看看这个存储过程,为何有事不能插入呢。(很简单的一个存储过程)


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER proc [dbo].[V_Insert]
@id bigint
as 
declare @idExist bit
select  @idExist =  count(id) from visit where id=@id
begin
if @idExist=0
INSERT INTO visitqq (id) VALUES (@id)
end
return @idExist


多线程插入1000条记录 实际只能写入 800多条, 这是怎么回事。 如果把判断条件去掉就好了。

请高手帮我检查下是哪的问题,感激不尽。
------最佳解决方案--------------------
ALTER proc [dbo].[V_Insert]
@id bigint
as 
IF NOT EXISTS(SELECT 1 FROM visit where id=@id)
INSERT INTO visitqq (id) VALUES (@id)

return @idExist


注意判断时用visit表,插入是visitqq表

是否正确看没插入的数据是否已存在visitqq表
------其他解决方案--------------------
判断去掉数据是有重复的吧? 这个是因为插入ID已存在 造成没有执行插入操作
------其他解决方案--------------------
是否有重复数据ID,插入时被过滤了
------其他解决方案--------------------
我理解也应该是重复数据造成的。
------其他解决方案--------------------
应该是visit表数据有重复,虽然你返回判断值有1000个,那你看看返回的有没有重复?
------其他解决方案--------------------
引用:
SQL code?1234567ALTER proc [dbo].[V_Insert]@id bigintas IF NOT EXISTS(SELECT 1 FROM visit where id=@id)    INSERT INTO visitqq (id) VALUES (@id) return @idExist

注意判断时用visit表,插入是visitqq……


打错而已。实际过程中没有这个错误
------其他解决方案--------------------
引用:
我理解也应该是重复数据造成的。


昨天太晚了,没说清楚,根据返回值判断都是1000个啊。




public static bool Add(Int64 id)
        {
            SqlParameter[] param = new SqlParameter[]
            {
                  new SqlParameter{ ParameterName="@id", SqlDbType= SqlDbType.BigInt,Value= id}
            };
            return Convert.ToBoolean(SqlHelper.ExecuteScalar("V_Insert", CommandType.StoredProcedure, param));
        }




 if (!Sql.Visit.Add(id))
                {
                    lock (loginLock1)
                    {
                        recordTotal++;
                    }