使用随机字符串作为主键是一个非常糟糕的主意。
它会影响性能和存储大小,并且使用具有标识属性的 int 或 bigint 会更好。
然而,在 SQL 中生成随机字符串可能对其他事情有用,这就是我提供此解决方案的原因:
创建一个表来保存允许的字符值。
在我的示例中,允许的字符是 0-9 和 A-Z。
CREATE TABLE Chars (C char(1))
DECLARE @i as int = 0
WHILE @i < 10
BEGIN
INSERT INTO Chars (C) VALUES (CAST(@i as Char(1)))
SET @i = @i+1
END
SET @i = 65
WHILE @i < 91
BEGIN
INSERT INTO Chars (C) VALUES (CHAR(@i))
SET @i = @i+1
END
然后使用这个简单的选择语句从这个表中生成一个随机字符串:
SELECT TOP 10 C AS [text()]
FROM Chars
ORDER BY NEWID()
FOR XML PATH('')
优点:
- 您可以轻松控制允许的字符。
- 新字符串的生成是一个简单的选择语句,而不是对字符串的操作。
缺点:
示例:
SELECT TOP 10 C AS [text()]
FROM (
SELECT * FROM Chars
UNION ALL SELECT * FROM Chars
) InnerSelect
ORDER BY NEWID()
FOR XML PATH('')
另一种选择是使用STUFF 函数而不是As [Text()] 来消除那些讨厌的XML 标签:
SELECT STUFF((
SELECT TOP 100 ''+ C
FROM Chars
ORDER BY NEWID()
FOR XML PATH('')
), 1, 1, '') As RandomString;
这个选项没有列名难看的缺点,可以直接有别名。执行计划稍有不同,但它不应该遭受很多性能损失。
Play with it yourself in this Sql Fiddle
如果您认为还有其他优点/缺点,请发表评论。谢谢。