服务器: 消息 2627,级别 14,状态 1,过程 pr_TableName_View,行 6
违反了 PRIMARY KEY 约束 'PK_TableName'。不能在对象 'TableName' 中插入重复键。
语句已终止。
我也想不通明明没有重复的值为什么报重复插入呢,不解中...

解决方案 »

  1.   

    Create Function f_TableNameIDCode() --自动加一函数(用户创建信息表)
     Returns char(3)
    As
     Begin
    Return(Select Right(1000001 + Isnull(Right(Max(IDCode),3),0),3) 
      From TableName With(Xlock,Paglock))
     End
    Go
    Create Table TableName --存放自己创建的表的所有信息(有问题,不能添加信息,有重复键出现,但一条数据一条数据添加没有问题)
    (
     IDCode char(3) DEFAULT dbo.f_TableNameIDCode(), 
     Name varchar(30),
     Xtype char(2),
     Crdate datetime,
     Res varchar(255),
       Constraint PK_TableName Primary Key (IDCode)
    )
    GoCreate Procedure pr_TableName_View
     As
      Begin
        Truncate Table TableName
        Insert Into TableName([Name],Xtype,Crdate) 
            Select Convert(varchar(30),[name]),xtype,crdate From sysobjects 
                          Where (xtype = 'U') Or ([name] Like 'pr_%') Or([name] Like 'tr_%') Or ([name] Like 'vW_%') Order By xtype
      End
    Go
    Exec pr_TableName_View
    Select * From TableName
    Drop Table TableName
    Drop Function f_TableNameIDCode
    Drop Procedure pr_TableName_View
      

  2.   

    IDCode char(3) DEFAULT dbo.f_TableNameIDCode(), 
    ================〉
    字段定义的长度太小,字符串会截断,出现重复值,改为ID Code varchar(100)
      

  3.   

    我改了啊,还是这样的,,表名字长度都是很小的,,他错误是出现在IDCode,函数我看都是正确的返回嘛,,001,002这么返回的嘛。
      

  4.   

    不好意思,看错了Insert Into TableName([Name],Xtype,Crdate) 
            Select Convert(varchar(30),[name]),xtype,crdate From sysobjects 
                          Where (xtype = 'U') Or ([name] Like 'pr_%') Or([name] Like 'tr_%') Or ([name] Like 'vW_%') Order By xtype这一句是作为一个事务运行的,因此函数f_TableNameIDCode计算出来的 IDCode是同一个值,但是IDCode上又有主键约束
      

  5.   

    你可以利用identity列和计算列实现:
    Create Table TableName --存放自己创建的表的所有信息(有问题,不能添加信息,有重复键出现,但一条数据一条数据添加没有问题)
    (
     ID int identity,
     IDCode as right(convert(varchar,(100000+ID)),3), 
     Name varchar(30),
     Xtype char(2),
     Crdate datetime,
     Res varchar(255)
    )
    GoCreate Procedure pr_TableName_View
     As
      Begin
        Truncate Table TableName
        Insert Into TableName([Name],Xtype,Crdate) 
            Select Convert(varchar(30),[name]),xtype,crdate From sysobjects 
                          Where (xtype = 'U') Or ([name] Like 'pr_%') Or([name] Like 'tr_%') Or ([name] Like 'vW_%') Order By xtype
      End
    Go
    Exec pr_TableName_View
    Select * From TableName
    Drop Table TableName
    Drop Procedure pr_TableName_View
      

  6.   

    不好意思,刚才吃饭去了,那有没有解决方法呢?改为ID Code varchar(100)好像也不能完全解决问题吧,其他这样类型的表操作就可以,只有这个表例外,郁闷中........
      

  7.   

    服务器: 消息 8111,级别 16,状态 2,行 1
    无法在表 'TableName' 中可为空的列上定义 PRIMARY KEY 约束。
    服务器: 消息 1750,级别 16,状态 1,行 1
    未能创建约束。请参阅前面的错误信息。