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(),
从插入
结束
将其作为触发器。