【问题标题】:Stored Procedure Storing 0 in Auto increment column in Table存储过程在表的自动增量列中存储 0
【发布时间】:2015-01-14 12:57:27
【问题描述】:

我有下表,其中 ProspectCode 是 Identity Not Null

Table LeadMastersNew

ProspectCode    int 
CompanyName nvarchar(50)    
PersonName  nvarchar(50)    
Designation nvarchar(50)
Number  nvarchar(50)    
Number2 nvarchar(50)    
Emailaddress    nvarchar(50)    
Address nvarchar(MAX)   
Address2    nvarchar(MAX)
CityName    nvarchar(50)    
State   nvarchar(50)    
PinNumber   nvarchar(50)    
Product nvarchar(50)    
RemarkNote  nvarchar(MAX)   

我最近面临的问题是,当我使用存储过程将记录存储到上表时,我添加的所有行的 ProspectCode 始终设置为 0。我在上表中有 160 条记录,但是当我添加了新记录,我添加的所有记录的 ProspectCode 设置为 0。

存储过程

ALTER Procedure [dbo].[Proc_InsertLeads]

 @ProspectCode nvarchar(50),@CompanyName nvarchar(50),@PersonName nvarchar(50),@Designation nvarchar(50),@Number nvarchar(50),  
 @Number2 nvarchar(50),@Emailaddress nvarchar(50),@Address nvarchar(MAX),@Address2 nvarchar(MAX),   
 @CityName nvarchar(50),@State nvarchar(50),@PinNumber nvarchar(50),@Product nvarchar(50),@RemarkNote nvarchar(MAX)

 AS

 BEGIN

      SET IDENTITY_INSERT LeadMastersNew ON;

      INSERT INTO LeadMastersNew
      (ProspectCode,CompanyName,PersonName,Designation,Number,Number2,Emailaddress,Address,Address2,CityName,State,PinNumber,Product,RemarkNote) 
      VALUES(@ProspectCode,@CompanyName,@PersonName,@Designation,@Number,@Number2,@Emailaddress,@Address,@Address2,@CityName,@State,@PinNumber,@Product,@RemarkNote) 

      INSERT INTO LoggerLeadMasters
      (ProspectCode,CompanyName,PersonName,Designation,Number,Number2,Emailaddress,Address,Address2,CityName,State,PinNumber,Product,RemarkNote,Activity,ActivityTime) 
      VALUES(@ProspectCode,@CompanyName,@PersonName,@Designation,@Number,@Number2,@Emailaddress,@Address,@Address2,@CityName,@State,@PinNumber,@Product,@RemarkNote,'New Record Added',getdate()) 

      SET IDENTITY_INSERT LeadMastersNew OFF;

END  


EXEC Proc_InsertLeads'ABc','Mr abc','MD','PhoneNumber','','abc@abcindia.com','xyz','','Mumbai','Maharashtra','400059','Abc', 'Abc'

Sets ProspectCode to 0

谁能帮我解决这个问题?我是否必须更改我的存储过程或表架构?

谢谢

【问题讨论】:

  • “我是否必须更改我的存储过程” - 当您没有向我们展示该存储过程中的任何代码时,您期望得到答案?
  • ProspectCode 是否设置为自动递增?
  • 对不起@Damien_The_Unbeliever 我会更新我的问题
  • @Damien_The_Unbeliever 我已经更新了我的问题
  • 不要在全球论坛上公开您的业务,您可以使用虚拟术语更改业务术语。

标签: c# sql-server-2008 stored-procedures


【解决方案1】:

如果您希望标识列自动分配数字,您真正不应该做的事情是将IDENTITY_INSERT 设置为ON。打开该设置对 SQL Server 表示“相信我,我会在标识列中提供值”。

你可能想要这样的代码:

BEGIN

     DECLARE @NewID int

      INSERT INTO LeadMastersNew
      (/*ProspectCode,*/CompanyName,PersonName,Designation,Number,Number2,Emailaddress,Address,Address2,CityName,State,PinNumber,Product,RemarkNote) 
      VALUES(/*@ProspectCode,*/@CompanyName,@PersonName,@Designation,@Number,@Number2,@Emailaddress,@Address,@Address2,@CityName,@State,@PinNumber,@Product,@RemarkNote) 

     SET @NewID = SCOPE_IDENTITY()

      INSERT INTO LoggerLeadMasters
      (ProspectCode,CompanyName,PersonName,Designation,Number,Number2,Emailaddress,Address,Address2,CityName,State,PinNumber,Product,RemarkNote,Activity,ActivityTime) 
      VALUES(@NewID ,@CompanyName,@PersonName,@Designation,@Number,@Number2,@Emailaddress,@Address,@Address2,@CityName,@State,@PinNumber,@Product,@RemarkNote,'New Record Added',getdate()) 

END  

这在第一次可能无法完全正常工作,因为我无法将您显示的代码与您的调用方式相协调。如果ProspectCode 确实是int 列,而您实际上是在尝试插入nvarchar'Choice Brokers' 值,您应该会收到错误消息。

【讨论】:

  • @user2614235 我们了解到您正在从 C# 传递值;目前尚不清楚您希望我们从该评论中做什么;你觉得这个(非常清楚的)答案的哪一部分没有回答你的问题?因为我认为确实如此:基本上,不要那样做
  • 非常感谢 Damien 您的解决方案帮助了@MarcGravell 非常感谢,下次我会在提问时更加准确...
【解决方案2】:

如果设置自动增量,则不需要 identity_insert

删除行

SET IDENTITY_INSERT LeadMastersNew ON;

SET IDENTITY_INSERT LeadMastersNew OFF;

它应该可以工作

【讨论】:

  • @user2614235 “没用”作为声明几乎没有用; 发生了什么?我完全同意 Ash 的观点;如果您经常使用IDENTITY_INSERT,那么您做的事情非常错误。这有非常有限个有效用例,我不认为这是其中之一。
  • @MarcGravell 我删除了 SET IDENTITY_INSERT LeadMastersNew ON; SET IDENTITY_INSERT LeadMastersNew OFF;但是 ProspectCode 将 Autoincrement 值存储为 0
  • @user2614235 告诉我们您尝试了什么;它没有告诉我们发生了什么;我猜它告诉你不要尝试分配给ProspectCode:它是正确的 - 见 Damien 的回答
【解决方案3】:

这里ProspectCode 必须设置为Auto-increment,因为它是表的标识列。所以基本上在存储过程中,您必须删除输入参数@ProspectCode,并且在插入新行时不要在表上 ON OFF IDENTITY_INSERT,最终存储过程如下所示:

ALTER Procedure [dbo].[Proc_InsertLeads]

@CompanyName nvarchar(50),@PersonName nvarchar(50),@Designation nvarchar(50),@Number nvarchar(50), 
@Number2 nvarchar(50),@Emailaddress nvarchar(50),@Address nvarchar(MAX),@Address2 nvarchar(MAX),
@CityName nvarchar(50),@State nvarchar(50),@PinNumber nvarchar(50),@Product nvarchar(50),@RemarkNote nvarchar(MAX)

 AS

 BEGIN

  DECALRE @ID INT = 0

  INSERT INTO LeadMastersNew
  (CompanyName,PersonName,Designation,Number,Number2,Emailaddress,Address,Address2,CityName,State,PinNumber,Product,RemarkNote) 
  VALUES(@CompanyName,@PersonName,@Designation,@Number,@Number2,@Emailaddress,@Address,@Address2,@CityName,@State,@PinNumber,@Product,@RemarkNote) 

  SET @ID = SCOPE_IDENTITY() 

  INSERT INTO LoggerLeadMasters
  (ProspectCode,CompanyName,PersonName,Designation,Number,Number2,Emailaddress,Address,Address2,CityName,State,PinNumber,Product,RemarkNote,Activity,ActivityTime) 
  VALUES(@ID,@CompanyName,@PersonName,@Designation,@Number,@Number2,@Emailaddress,@Address,@Address2,@CityName,@State,@PinNumber,@Product,@RemarkNote,'New Record Added',getdate()) 


END

这里我使用@ID 参数在表LeadMastersNew 中查找新插入的ProspectCode,它将在表LoggerLeadMasters 中用作ProspectCode

【讨论】:

  • 注意@@IDENTITY不推荐;如果可能,您应该改用SCOPE_IDENTITY(),因为它不受触发器之类的影响/混淆
  • @MarcGravell 对,已编辑答案,还有什么会影响 sql server 中的 @@identity 全局变量而不是触发器?
猜你喜欢
  • 2020-06-22
  • 2011-05-27
  • 2010-12-24
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多