IF EXISTS (SELECT name
FROM sys.tables
WHERE name = 'Nums')
BEGIN
DROP TABLE dbo.Nums;
END
CREATE TABLE dbo.Nums
(
number INT NOT NULL,
CONSTRAINT PK_Nums PRIMARY KEY CLUSTERED(number ASC),
code Char(9),
date DATETIME
) ON [PRIMARY]
INSERT INTO Nums (number, code, date)
VALUES (0, 485658235, '2000/01/01')
DECLARE @number int, @code Char(9), @date datetime
SET @number = (SELECT MAX (Number) FROM nums)
SET @date = (SELECT Date FROM Nums)
SET @code = (SELECT code FROM Nums)
WHILE @number < 100000
BEGIN
INSERT INTO Nums--(number, code, date)
VALUES (@number, @code, @date)
SET @number = @number + 1
SET @date = DATEADD(DAY, 5, @date)
SET @code = LEFT(CAST(CAST(CEILING(RAND()* 10000000000) AS bigint) AS varchar),9)
END
SELECT * FROM Nums
这是我得到的错误:
Msg 2627, Level 14, State 1, Line 41
违反PRIMARY KEY约束'PK_Nums'。无法在对象'dbo.Nums'中插入重复键。重复键值为(0)
需要在循环开始前给数字加1。
错误Violation of PRIMARY KEY constraint
通常不是批量中止,因此执行将继续执行下一条语句。
如果你想停止它,要么强制批处理中止并回滚:SET XACT_ABORT ON
(可能是个好主意),或者使用TRY/CATCH
。
我假设您也意识到您的过程可以在一个语句中完成,通过连接一个计数表或函数(例如Itzik Ben-Gan的这些),像这样:
INSERT @Nums (number, code, date)
SELECT
t.Num,
LEFT(CAST(CAST(CEILING(RAND()* 10000000000) AS bigint) AS varchar),9),
'2000/01/01'
FROM fnTallyTable (0, 99999) t