在SQL Server中,生成不重复的随机数是一个常见的需求,特别是在测试、数据分析或者密码生成等场景。本篇文章主要探讨如何利用SQL Server的内置函数来创建一个不重复的随机字符串序列。

我们要理解如何在SQL Server中生成随机字符。这里使用了`CHAR()`函数,它能将一个ASCII码转换为对应的字符。ASCII码是从0到255的一个整数范围,包含了大小写字母、数字以及各种特殊字符。以下是一些示例:

- 大写字母:`CHAR(ROUND(RAND() * 25 + 65,0))` - 这里的65对应ASCII码中的'A',25是因为'A'到'Z'之间有25个字符。

- 小写字母:`CHAR(ROUND(RAND() * 25 + 97,0))` - 同理,97对应'a'。

- 特殊字符:`CHAR(ROUND(RAND() * 13 + 33,0))` - 33对应'!',而'!'到'~'(包含)之间有13个特殊字符。

- 数字:`CHAR(ROUND(RAND() * 9 + 48,0))` - 48对应'0',0到9之间有9个数字。

结合这些基础,可以构建一个存储过程`usp_RandomNumber`来生成指定长度和数量的不重复随机字符串。存储过程如下:

```sql

CREATE PROCEDURE [dbo].[usp_RandomNumber]

@Len INT = 1, -- 随机数位数

AS

BEGIN

DECLARE @Result NVARCHAR(MAX);

DECLARE @Chars TABLE (ID INT PRIMARY KEY, Value INT);

INSERT INTO @Chars (ID, Value) VALUES (65, 'A'), (66, 'B'), (67, 'C'), (68, 'D'), (69, 'E'), (70, 'F'), (71, 'G'), (72, 'H'), (73, 'I'), (74, 'J'), (75, 'K'), (76, 'L'), (77, 'M'), (78, 'N'), (79, 'O'), (80, 'P'), (81, 'Q'), (82, 'R'), (83, 'S'), (84, 'T'), (85, 'U'), (86, 'V'), (87, 'W'), (88, 'X'), (89, 'Y'), (90, 'Z');

INSERT INTO @Chars (ID, Value) VALUES (97, 'a'), (98, 'b'), (99, 'c'), (100, 'd'), (101, 'e'), (102, 'f'), (103, 'g'), (104, 'h'), (105, 'i'), (106, 'j'), (107, 'k'), (108, 'l'), (109, 'm'), (110, 'n'), (111, 'o'), (112, 'p'), (113, 'q'), (114, 'r'), (115, 's'), (116, 't'), (117, 'u'), (118, 'v'), (119, 'w'), (120, 'x'), (121, 'y'), (122, 'z');

INSERT INTO @Chars (ID, Value) VALUES (33, '!');

INSERT INTO @Chars (ID, Value) VALUES (48, '0');

INSERT INTO @Chars (ID, Value) VALUES (49, '1');

INSERT INTO @Chars (ID, Value) VALUES (50, '2');

INSERT INTO @Chars (ID, Value) VALUES (51

以下是重构后的代码:

```sql

CREATE PROCEDURE dbo.usp_RandomNumber

@Rows INT = 1, -- 随机笔数

@Len INT = 8 -- 随机数的位数

AS

BEGIN

DECLARE @T TABLE([Random Number] VARCHAR(MAX))

DECLARE @L INT = 1, @R INT = 1

DECLARE @RN varchar(MAX)

WHILE @R <= @Rows

BEGIN

SET @RN = ''

WHILE @L <= @Len

BEGIN

SET @RN = @RN + CHAR(ROUND(RAND() * 9 + 48, 0))

SET @L = @L + 1

END

IF NOT EXISTS (SELECT [Random Number] FROM @T WHERE [Random Number] = @RN)

BEGIN

INSERT INTO @T SELECT @RN

SET @R = @R + 1

SET @L = 1

END

END

SELECT [Random Number] FROM @T

END

```

当你执行这个存储过程,例如`EXECUTE [dbo].[usp_RandomNumber] 8,10`,它会返回10个长度为8的不重复随机数字符串。需要注意的是,由于随机性,每次执行得到的结果都会不同。

此外,文章还对其他数据库系统如MySQL中的随机数生成方法进行了介绍,但本文主要集中讨论SQL Server的实现。这种实现方式赋予了我们在SQL Server环境中生成满足特定需求的随机数据的能力,极大地提高了我们进行测试、模拟数据生成或创建安全密码等任务的灵活性和效率。