2017-01-11 9 views
0

У меня есть следующий SQL для создания моего случайного varchar с использованием пользовательской функции generateString().Использование случайного строкового значения для обновления всех строк в столбце для целей тестирования

CREATE VIEW rndView 
AS 
    SELECT RAND() rndResult 
GO 

CREATE FUNCTION RandFn() 
RETURNS DECIMAL(18,18) 
AS 
BEGIN 
    DECLARE @rndValue DECIMAL(18,18) 

    SELECT @rndValue = rndResult 
    FROM rndView 

    RETURN @rndValue 
END 
GO 

ALTER FUNCTION generateString() 
RETURNS VARCHAR 
AS 
BEGIN 
    DECLARE @exclude varchar(50) 
    SET @exclude = '0:;<=>[email protected][]`^\/' 

    DECLARE @char char 
    DECLARE @len char 
    DECLARE @output varchar(50) 

    SET @output = '' 
    SET @len = 8 

    DECLARE @random DECIMAL(18,18) = (SELECT dbo.RandFn()) 

    while @len > 0 begin 
     select @char = char(round(@random * 74 + 48, 0)) 

     if charindex(@char, @exclude) = 0 begin 
      set @output = @output + @char 
      set @len = @len - 1 
     end 
    end 

    RETURN @output 
END 

Однако, при попытке использовать эту функцию в UPDATE пункта ниже, запрос никогда не заканчивается. У меня менее 100 записей. Цель состоит в том, чтобы получить случайные varchar данные во все строки на определенном столбце таблицы ...

UPDATE dbo.Inci 
SET SerialText = dbo.generateString() 
+0

Есть ли у вас какие-либо ограничения в случайных данных 'varchar', как будто это должно быть 8 символов или у него должен быть один символ по крайней мере, что-нибудь в этом роде? –

+0

Нет, мне просто нужны случайные данные varchar в поле. Все прямо сейчас в столбце NULL и не подходит для тестирования. – vercingortix

+0

Затем просто используйте 'Newid()'. Что-то вроде этого 'UPDATE dbo.Inci SET SerialText = newid()' –

ответ

2

Когда @char является наличие одного из исключения символов '0:;<=>[email protected][]``^\/' тогда Если условие WLL неудачу и @len не будет уменьшаться, то в следующем цикле также будет использовано такое же значение @random, и то же самое будет @char, так что это будет бесконечный цикл.

Переместить инициализацию переменной @random внутри цикла while, чтобы генерировать новое случайное значение в каждом цикле.

DECLARE @random DECIMAL(18,18) 

while @len > 0 begin 
    SELECT @random = dbo.RandFn() 
    select @char = char(round(@random * 74 + 48, 0)) 

    if charindex(@char, @exclude) = 0 begin 
     set @output = @output + @char 
     set @len = @len - 1 
    end 
end 
+0

Это близко, но только обновление столбца включает в себя 1 символ вместо цельной «строки». – vercingortix

+0

@vercingortix - обновил мой ответ –

+0

Я думаю, что здесь происходит что-то еще. Он просто побежал на 14 минут без признаков остановки. У меня есть только 82 записи, которые я обновляю, так что это не может честно так долго? – vercingortix