需求:產生 300 個 8 位數字(10000000~99999999),且不重複。以下腳本使用暫存表配合 NOT EXISTS 去重,簡單可靠:
DECLARE @i INT = 0;
DECLARE @j INT;
DECLARE @qnum INT = 300; -- 目標筆數
SET NOCOUNT ON;
CREATE TABLE #temp_Table (num INT);
WHILE (@i < @qnum)
BEGIN
-- 產生 8 位隨機數
SELECT @j = CAST(FLOOR(RAND() * (99999999 - 10000000) + 10000000) AS INT);
-- 不存在才寫入
IF (NOT EXISTS (SELECT 1 FROM #temp_Table WHERE num = @j))
BEGIN
INSERT #temp_Table (num) VALUES (@j);
SET @i += 1;
END
END
SELECT DISTINCT num FROM #temp_Table;
DROP TABLE #temp_Table;
NOT EXISTS 配合索引效能佳;若筆數極大(萬筆以上),建議改用 NEWID() 排序取前 N 筆,或使用集合式寫法避免循環。SET NOCOUNT ON 可減少網路傳輸開銷。;WITH cte AS (
SELECT TOP 300
CAST(FLOOR(RAND(CHECKSUM(NEWID())) * 90000000) + 10000000 AS INT) AS num
FROM sys.objects a CROSS JOIN sys.objects b
)
SELECT DISTINCT num FROM cte;
利用系統表交叉產生足夠列數,再取不重複前 300 筆,效能遠優於循環。