2012-04-11 3 views
4

Я пытаюсь сгенерировать строку, отформатированную как: 99-88-77, где три числа 2-разрядных чисел генерируются случайным образом.TSQL RAND() Проблема

Мой TSQL, который работает:

declare @result nvarchar(50) 
    DECLARE @counter smallint, @ci smallint, @cu smallint, @dc smallint 

     SET @ci=RAND()*100 
     SET @cu=RAND()*100 
     SET @dc=RAND()*100 

     --SET @counter = @counter + 1 

    set @result = CAST(@ci AS varchar(2)) +'-'+CAST(@cu AS varchar(2))+'-'+CAST(@dc AS varchar(2)) 
    print @result 

Производит (на этот раз): 16-37-30

Мне нужно, чтобы получить эту строку для каждой записи, вставленной в таблицу.

Теперь я хотел бы обернуть это в функцию, но, видимо, я не могу использовать RAND() в UDF.

Как я могу обернуть это для вызова при использовании инструкции insert?

ответ

5

Вы можете сделать это как двухэтапный процесс.

Во-первых, создать представление, чтобы сгенерировать случайное число:

CREATE VIEW vRandNumber 
AS 
SELECT RAND() as RandNumber 

Во-вторых, создать свой UDF тянуть с точки зрения:

CREATE FUNCTION dbo.udfTest 
(
) 
RETURNS nvarchar(50) 
AS 
BEGIN 

    DECLARE @result nvarchar(50) 
    DECLARE @counter smallint, @ci smallint, @cu smallint, @dc smallint 

    SET @ci=(SELECT RandNumber FROM vRandNumber)*100 
    SET @cu=(SELECT RandNumber FROM vRandNumber)*100 
    SET @dc=(SELECT RandNumber FROM vRandNumber)*100 

    set @result = CAST(@ci AS varchar(2)) +'-'+CAST(@cu AS varchar(2))+'-'+CAST(@dc AS varchar(2)) 

RETURN @result 
END 

Это вернет ваше значение, которое вы только что просили. Затем, когда вы хотите, чтобы значение вашего просто использовать, и вы получите ваш случайный ответ:

SELECT dbo.udfTest() 

ИЛИ

INSERT INTO yourTable 
(
    randNumber 
) 
SELECT dbo.udfTest() 

Я просто проверял это в SQL Server 2005, и она работала.

+0

+1 хороший способ вокруг rand() issue – wickedone

+0

Отлично! Благодаря! – kaplooeymom

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