2012-01-28 2 views
0

У меня есть инструкция таблица, которая оказывает USERID (первичный ключ), Имя пользователя, ПарольГенерация случайных значение в SQL сервере 2005

Существует хранимая процедура, которая принимает список пользователей, как XML. Мое требование - вставить пользователей в таблицу User, но перед вставкой мне нужно проверить, существует ли имя пользователя. Если существует, то с именем пользователя следует добавить случайное число.

Как проверить, существует ли имя пользователя или нет, и рандомизируйте его, ниже - 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, он не будет конфликтовать с другим именем пользователя. –

ответ

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

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 так может быть стоит ждать, чтобы увидеть, что другие ответы появляются, чтобы получить сбалансированную точку зрения. Я был бы заинтересован сам.

Смежные вопросы