sql - T-SQL : Use t-sql while routine return value in SELECT

标签 sql sql-server sql-server-2005 tsql sql-server-2008

我有一个 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/

相关文章:

php - 拉维 4 : validation unique (database) multiple where clauses

sql-server - LINQ 在字符串上放置不需要的尾随空格

sql - t-SQL 使用行号,但在重复的行上使用相同的数字

sql - 当前在 SQL Server 中运行查询

sql-server-2005 - 使用服务器复制和客户端复制配置 SQL Server 2005

mysql - 如何将唯一 ID 添加到 mysql 表?

SQL SERVER T-SQL 按组计算小计和总计

c# - SQL 2005 最佳 "Paging"

SQL服务器: get default value of a column

Mysql统计所有包含数字1、2、3或4的列