我有一个 T-SQL 例程,可以将用户信息从一个表“Radius”复制到另一个“标签”。但是,随着行的传输,我还想在 INSERT 中包含一个随机生成的唯一代码(3 个字符长)。代码由下面的 WHILE 循环生成。有什么办法吗?
INSERT Tags (UserID, JobID, Code)
SELECT UserID, @JobID, ?????
FROM Radius
独特的随机码生成器:
WHILE EXISTS (SELECT * FROM Tags WHERE Code = @code)
BEGIN
select @code=@code+char(n) from
(
select top 3 number as n from master..spt_values
where type='p' and number between 48 and 57 or number between 65 and 90
order by newid()
)
END
澄清:这样做的原因是我想将随机代码生成逻辑保持在 SQL 堆栈级别。在应用程序代码中实现它需要我在每次生成潜在随机代码时检查数据库以查看它是否唯一。随着代码记录数量的增加,对数据库的调用次数也会增加,因为在生成唯一代码之前会生成更多重复代码。
最佳答案
第一部分,生成包含所有可能值的表
DECLARE @i int
CREATE TABLE #AllChars(value CHAR(1))
SET @i=48
WHILE @i<=57
BEGIN
INSERT INTO #Allchars(value) VALUES(CHAR(@i))
SET @i=@i+1
END
SET @i=65
WHILE @i<=90
BEGIN
INSERT INTO #Allchars(value) VALUES(CHAR(@i))
SET @i=@i+1
END
CREATE TABLE AllCodes(value CHAR(3),
CONSTRAINT PK_AllChars PRIMARY KEY CLUSTERED(value))
INSERT INTO AllCodes(value)
SELECT AllChars1.Value+AllChars2.Value+AllChars3.Value
FROM #AllChars AS AllChars1,#AllChars AS AllChars2,#AllChars AS AllChars3
这是一次性操作,在 SQL Azure 上运行大约需要 1 秒。现在您已经在表中拥有所有可能的值,任何 future 的插入都会变成,类似于
SELECT
RadiusTable.UserID,
RadiusTable.JobID,
IDTable.Value
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY UserID,JobID) As RadiusRow,
UserID,JobID
FROM Radius
) AS RadiusTable INNER JOIN
(
SELECT ROW_NUMBER() OVER (ORDER BY newID()) As IDRow,
Value
FROM AllCodes
) AS IDTable ON RadiusTable.RadiusRow = IDTable.IDRow
在使用任何这些方案之前,您最好确定表中的行数不会超过 46656 行,否则您将用完唯一 ID 值。
关于sql - T-SQL : Use t-sql while routine return value in SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6742769/