2012-01-28 93 views
0

我有一個用戶表,它具有Userid(主鍵),用戶名,密碼在SQL Server 2005中生成隨機值

存在一個存儲過程,它接受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) 
+0

你可以追加'UserID',而不是產生一個隨機數。由於'UserID'是PK,它保證不會與另一個用戶名發生衝突。 – 2012-01-28 09:49:00

回答

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 
+0

感謝Arion的解決方案,這工作。 – HashCoder 2012-01-30 08:01:23

1

以下信息可能有助於讓你開始。

首先我生成一個介於1和100之間的隨機數。其次,我檢查用戶名是否已經存在,並且如果已經存在,則插入數據庫或追加隨機數。

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一個新手所以可能是值得等待,看看有什麼其他的答案冒出來得到一個平衡的觀點。我會對自己感興趣。