虽然它通过存储过程插入第一行,但无法将第二行插入表中

时间:2012-12-14 07:22:18

标签: sql-server stored-procedures

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

我的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         

1 个答案:

答案 0 :(得分:2)

这是问题所在:

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

这本来就没有意义。您将变量与自身进行比较。从其中一个@引用中取出CompanyId符号。 SQL Server中不需要RTrimLTrim也没有意义,因为后面的插入也不会LTrim因此最终会出错。

此外,在EXISTS子句中,除非您使用ORDER BY并对最终结果执行某些操作,否则TOP没有意义。只需在SELECT *子句中执行EXISTS

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