Генерация случайных значений в SQL Server 2005 - PullRequest
0 голосов
/ 28 января 2012

У меня есть таблица пользователей, в которой есть идентификатор пользователя (первичный ключ), имя пользователя, пароль

Существует хранимая процедура, которая принимает список пользователей в виде 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)

Ответы [ 2 ]

1 голос
/ 29 января 2012

Может быть, это поможет:

--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
1 голос
/ 28 января 2012

Следующее может помочь вам начать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...