我想您会发现我的题为 How to pre-populate a random strings pool 的博文对这个要求很有帮助。
(受 Martin Smith 的 this SO answer 启发,在应得的地方给予表扬)
它描述了一个内联表值用户定义函数,该函数生成一个随机值表,您可以使用它来更新数据。
但是,它不保证这些值的唯一性。为此,您必须在从中选择时使用DISTINCT。
因此,您可能遇到的一个问题是结果的值少于您生成的值,但是对于您在问题中所写的每个表的 1,000 条记录,这可能不会成为问题,因为该函数每个最多可以生成 1,000,000 条记录你叫它的时间。
为了完整起见,我也会在此处发布代码,但您可能应该阅读我博客上的帖子。
此外,在另一篇名为 A more controllable random string generator function for SQL Server 的博客文章中还有另一个版本的此函数 - 它可以让您更好地控制随机字符串的内容 - 即仅包含数字或仅包含低位数字的字符串。
您需要做的第一件事是创建一个视图,该视图将为您生成一个新的 guid,因为这无法在用户定义的函数中完成:
CREATE VIEW GuidGenerator
AS
SELECT Newid() As NewGuid
然后,函数代码:(注意:这是更简单的版本)
CREATE FUNCTION dbo.RandomStringGenerator
(
@Length int,
@Count int -- Note: up to 1,000,000 rows
)
RETURNS TABLE
AS
RETURN
-- An inline tally table with 1,000,000 rows
WITH E1(N) AS (SELECT N FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)) V(N)), -- 10
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --100
E3(N) AS (SELECT 1 FROM E2 a, E2 b), --10,000
Tally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY @@SPID) FROM E3 a, E2 b) --1,000,000
SELECT TOP(@Count) (
SELECT TOP (@Length) CHAR(
-- create a random number from a guid using the GuidGenerator view, mod 3.
CASE Abs(Checksum(NewGuid)) % 3
WHEN 0 THEN 65 + Abs(Checksum(NewGuid)) % 26 -- Random upper case letter
WHEN 1 THEN 97 + Abs(Checksum(NewGuid)) % 26 -- Random lower case letter
ELSE 48 + Abs(Checksum(NewGuid)) % 10 -- Random digit
END
)
FROM Tally As t0
CROSS JOIN GuidGenerator
WHERE t0.n != -t1.n -- Needed for the subquery to get re-evaluated for each row
FOR XML PATH('')
) As RandomString
FROM Tally As t1
然后,您可以像这样使用它来获得一个不同的随机字符串:
SELECT DISTINCT RandomString
FROM dbo.RandomStringGenerator(50, 5000);