【问题标题】:Random value generation in SQL server 2005SQL Server 2005 中的随机值生成
【发布时间】:2012-01-29 06:46:55
【问题描述】:

我有一个用户表,其中包含用户 ID(主键)、用户名、密码

有一个以 XML 形式接受用户列表的存储过程。我的要求是将用户插入用户表,但在插入之前我需要检查用户名是否已经存在。如果存在,则应在用户名后面附加一个随机数。

我如何检查用户名是否已经存在并随机化,下面是盲目插入用户名的sql。有什么帮助吗?

XML 结构:<ROOT><User UserId="0" Username="ajohn" Password="548788844" ></ROOT>

SQL:

INSERT INTO [User] (Username, Password) 
        SELECT tab.col.value('@Username','nVarchar(max)') AS Username,     tab.col.value('@Password','nVarchar(max)') AS Password,            
        FROM @pupilDetails.nodes('ROOT/User') tab(col)

【问题讨论】:

  • 您可以附加 UserID 而不是生成随机数。由于UserID 是PK,因此保证不会与其他用户名冲突。

标签: sql-server-2005


【解决方案1】:

也许这会有所帮助:

--Existing data
DECLARE @User TABLE
(
    UserId INT PRIMARY KEY CLUSTERED IDENTITY(1,1),
    Username nVarchar(MAX),
    Password nVarchar(MAX)
)
INSERT INTO @User(Username,Password)
SELECT 'bob_456254','1584526'
UNION ALL
SELECT 'ajohn_4525846','4561584'
--Something has to separate the username and the number I used "username"_"randomnumber"
--The xml
DECLARE @pupilDetails XML='<ROOT><User UserId="0" Username="ajohn" Password="548788844" ></User></ROOT>'

;WITH CTE AS
(
    SELECT
        tab.col.value('@Username','nVarchar(max)') AS Username,
        tab.col.value('@Password','nVarchar(max)') AS Password

    FROM
        @pupilDetails.nodes('ROOT/User') AS tab(col)
)
INSERT INTO @User
(
    Username,
    Password        
)
SELECT 
    CTE.Username+
    (
        CASE WHEN EXISTS
                (
                    SELECT
                        NULL
                    FROM
                        @User AS Users
                    WHERE
                        SUBSTRING(Users.Username,0,CHARINDEX('_',Users.Username))=CTE.Username
                )
            THEN '_'+CAST(ABS(CHECKSUM(NewId())) AS VARCHAR(MAX))
            ELSE ''
        END
    ) AS UserName,
    CTE.Password  
FROM 
    CTE

SELECT * FROM @User

【讨论】:

    【解决方案2】:

    以下内容可能有助于您入门。

    首先,我生成一个介于 1 和 100 之间的随机数。其次,我检查 UserName 是否已经存在,然后插入 DB 或附加随机数(如果已经存在)。

    DECLARE @RandomInteger int
    DECLARE @MaxValue int
    DECLARE @MinValue int
    
    SET @MaxValue = 100
    SET @MinValue = 1
    
    //Get random number between 1 and 100
    SET @RandomInteger = ((@MaxValue + 1) - @MinValue) * RAND() + @MinValue
    
    IF EXISTS (SELECT UserName FROM User WHERE UserName = @UserName)
      INSERT INTO [User] (UserName, Password)
      VALUES (@UserName + CAST(@RandomInteger AS VARCHAR), @Password)
    ELSE
      INSERT INTO [User] (UserName, Password)
      VALUES (@UserName, @Password)
    

    披露:我认为自己是 SQL 新手,因此可能值得等待,看看会出现什么其他答案以获得平衡的观点。我自己会感兴趣的。

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 2015-01-10
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      相关资源
      最近更新 更多