读书人

帮小弟我看看这个存储过程为何有事不

发布时间: 2012-12-17 09:31:40 作者: rapoo

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



set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER proc [dbo].[V_Insert]
@id bigint
as
declare @idExistbit
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++;
}


}


读书人网 >SQL Server

热点推荐