1

它成功插入了第一行,但没有插入任何其他行,尽管第二行没有主键冲突

我的aspx.cs文件中的代码:

 outputParVal = sqlCmd.Parameters[outputParName].Value; 

outparameter在存储过程中是---“结果”

CREATE PROCEDURE [dbo].[RecruiterProfileInsert]  
  @CompanyId int,     
  @CompanyName varchar(200),    
  @EmailId   varchar(50) ,    
  @Password  varchar(20) ,    
  @ContactNumber varchar(15),    
  @Website  varchar(50),    
  @CompanyProfile varchar(2000),   
  @IsVerified bit,   
  @Result Tinyint OutPut  
  --@CreatedDate  datetime ,    
  --UpdatedDate datetime         
AS  
BEGIN        
    -- Insert statements for procedure here          
 --check whether @CompanyName already exist or not if exist then return           
IF EXISTS(SELECT Top 1 * FROM  RecruiterProfile WHERE @CompanyId = LTRIM(RTRIM(@CompanyId)))        
 BEGIN          
  SET @Result = 0-- Already Exists          
 END          
ELSE          
BEGIN              
 INSERT INTO RecruiterProfile        
(    
  CompanyId,    
  CompanyName,    
  EmailId ,    
  Password ,    
  ContactNumber,    
  Website ,    
  CompanyProfile ,  
  IsVerified,    
  CreatedDate    
)        
 VALUES        
(    
@CompanyId,    
@CompanyName,        
@EmailId ,         
@Password,      
@ContactNumber,          
@Website,       
@CompanyProfile,  
@IsVerified,          
GetDate()  
)        
set @Result =1     
 return                
 END   
END         
4

1 回答 1

2

这就是问题:

SELECT Top 1 * FROM  RecruiterProfile WHERE @CompanyId = LTRIM(RTRIM(@CompanyId))

这本质上是没有意义的。您正在将变量与自身进行比较。从其中一个参考文献中取出@标志。CompanyIdRTrimSQL Server 中是不必要的,并且LTrim也没有意义,因为后来的插入也没有LTrim,所以最终会出错。

此外,在EXISTS子句内部,TOP 没有任何意义,除非您使用 ORDER BY 并对最终结果进行处理。只是在子句SELECT *里面做。EXISTS

还有一件事:如果存在高并发并且用户可能会尝试同时插入相同的内容,那么您的查询仍然可能因重复键违规而失败。

于 2012-12-14T07:32:29.843 回答