Sql 并行运行中的约束冲突

Sql 并行运行中的约束冲突,sql,sql-server-2008,loops,parallel-processing,sql-function,Sql,Sql Server 2008,Loops,Parallel Processing,Sql Function,我创建了一个函数,它将作为表的主键 CREATE FUNCTION dbo.NewCustomerPK() RETURNS VARCHAR (10) AS BEGIN DECLARE @LastCustID VARCHAR(10) DECLARE @newID INT DECLARE @charID CHAR(10) SELECT @LastCustID = MAX(CustID) FROM dbo.TestCust IF (@LastCustID IS

我创建了一个函数,它将作为表的主键

CREATE FUNCTION dbo.NewCustomerPK()
RETURNS VARCHAR (10)
AS
BEGIN
DECLARE @LastCustID VARCHAR(10)
DECLARE @newID      INT
DECLARE @charID     CHAR(10)


SELECT 
    @LastCustID = MAX(CustID)
FROM
    dbo.TestCust

IF (@LastCustID IS NULL)
BEGIN
    SET @LastCustID = 'CUST000001'
END
ELSE
BEGIN

    SET @newID  =   RIGHT(@LastCustID, 6) + 1
    SET @charID =   'CUST' + RIGHT(('0000000' + CONVERT(VARCHAR(6), @newID)), 6)
    SET @LastCustID =   @charID

END

RETURN @LastCustID

END

CREATE TABLE dbo.TestCust
(
   CustID   VARCHAR(10) PRIMARY KEY NOT NULL DEFAULT dbo.NewCustomerPK(),
   Name     VARCHAR(50) 
)
并尝试插入测试数据

DECLARE @Counter    INT = 1,
        @Stopper    INT = 500000

WHILE(@Counter <= @Stopper)
BEGIN

INSERT INTO dbo.TestCust(NAME)
VALUES('test'+CONVERT(VARCHAR(6), @Counter))

SET @Counter = @Counter + 1
END
DECLARE@Counter INT=1,
@止动器INT=500000

而(@Counter另一种方法是将标识列与计算列结合使用

create table dbo.TestCust
(
  ID int identity not null,
  CustID as isnull('CUST'+right('0000000' + convert(varchar(6), ID), 6), ''),
  Name varchar(50),
  constraint PK_TestCust_CustID primary key clustered (CustID) 
);
计算
CustID
时使用的
isnull
可以确保该列永远不会有空值,从而可以将
CustID
用作主键

不确定是否可以修复当前的设计。也许在添加新行时使用隔离级别serializable可以解决问题。

在TargetTable上创建触发器tru组
CREATE TRIGGER tr_Group ON TargetTable
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
    INSERT INTO dbo.targetTable
    SELECT dbo.NewCustomerPK(),<other fields>
    FROM INSERTED
END
而不是插入 作为 开始 不计较 插入到dbo.targetTable中 选择dbo.NewCustomerPK(), 从插入 结束
将其作为触发器。