Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Функция, возвращающая случайную строку.  [new]
mr.first
Member

Откуда:
Сообщений: 16
Привет всем!
Хотел написать функцию, возвращающую случайную строку. В функции использовал RAND, но оказалось, что недетерминированные функции типа RAND в функциях не поддерживаются......
хотел я это написать так:
CREATE FUNCTION f_RandItem
(
@RandItem VARCHAR
)
RETURNS VARCHAR
AS
BEGIN
declare @num REAL
declare @per INT
set @per=0
while @per<5
begin
-- переменной @num присваиваю случайное значение,
-- возвращаемое другой функцией
set @num=(SELECT dbo.f_Rand(RAND(), 0, 255, 0))
set @RandItem=@RandItem+cast((ASCII(@num)) as varchar)
set @per=@per+1
end
RETURN @RandItem
END
у меня ругается собственно на RAND.
Никто не в курсе как это можно обойти?
14 май 04, 12:52    [678524]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая случайную строку.  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Через представление
?

для примера:
https://www.sql.ru/faq/faq_topic.aspx?fid=129
14 май 04, 12:56    [678538]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая случайную строку.  [new]
Glory
Member

Откуда:
Сообщений: 104760
use pubs
go

if object_id('dbo.vwRAND') is not null and objectproperty(object_id('dbo.vwRAND'), 'Isview') = 1
	drop view dbo.vwRAND
go

create view dbo.vwRAND
AS
SELECT RAND() AS float_random
go

if object_id('dbo.ufn_fRand') is not null drop function dbo.ufn_fRand
go
create function dbo.ufn_fRand()
returns real
as
/*Returns random float*/
begin
declare @ret_value float
select @ret_value = float_random from vwRAND
return @ret_value
end
go

if object_id('dbo.ufn_fRandInRange') is not null drop function dbo.ufn_fRandInRange
go
create function dbo.ufn_fRandInRange(@a float=0, @b float=1)
returns float
as
/*Returns uniformly distributed float between a and b*/
begin
declare @ret_value float
select @ret_value = (@b-@a)*float_random+@a from vwRAND
return @ret_value
end
go

if object_id('dbo.ufn_iRand') is not null drop function dbo.ufn_iRand
go
create function dbo.ufn_iRand(@howmuchdigits int=2)
returns bigint
as
/*Returns random n-digit integer*/
begin
declare @ret_value bigint, @a bigint, @b bigint
set @a=power(cast(10 as bigint), @howmuchdigits)
set @b = power(cast(10 as bigint), @howmuchdigits+1)-1
select @ret_value = dbo.ufn_iRandInRange(@a, @b)
return @ret_value
end
go
if object_id('dbo.ufn_icRand') is not null drop function dbo.ufn_icRand
go
create function dbo.ufn_icRand(@howmuchdigits int=2)
returns varchar(20)
as
/*Returns random n-digit integer as string*/
begin
declare @ret_value varchar(20), @a bigint, @b bigint
set @a=0
set @b = power(cast(10 as bigint), @howmuchdigits+1)-1
select @ret_value = right(replicate('0',20)+cast(dbo.ufn_iRandInRange(@a, @b) as varchar(20)), @howmuchdigits)
return @ret_value
end
go

if object_id('dbo.ufn_iRandInRange') is not null drop function dbo.ufn_iRandInRange
go
create function dbo.ufn_iRandInRange(@a bigint=0, @b bigint=10)
returns bigint
as
/*Returns uniformly distributed int between a and b*/
begin
declare @ret_value bigint
select @ret_value = cast((@b-@a+1)*float_random+@a as bigint) from vwRAND
return @ret_value
end
go


select dbo.ufn_fRand(),
dbo.ufn_fRandInRange(default, default), 
dbo.ufn_iRand(5), 
dbo.ufn_iRandInRange(default, default) ,
dbo.ufn_icRand(3)
from sysobjects
14 май 04, 13:06    [678598]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая случайную строку.  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
Чтобы вернуть случайную строку можно попробовать:

SELECT TOP 1 OrderID, NewID() as Random
FROM Orders
ORDER BY Random

Однако не могу сказать, насколько хорошо перемешиваются значения.
14 май 04, 13:50    [678867]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая случайную строку.  [new]
mr.first
Member

Откуда:
Сообщений: 16
просто случайную строку (из цифр) я могу, но не получается вернуть строку из букв......
14 май 04, 14:04    [678965]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая случайную строку.  [new]
Палестинец
Member

Откуда:
Сообщений: 8314
select cast(cast (newid() as binary) as varchar)
14 май 04, 14:05    [678974]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая случайную строку.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
Inside SQL Server:
-- Method 2.   Generate random data in a loop.

IF (ISNULL(OBJECT_ID('random_data'), 0)) > 0 DROP TABLE random_data GO CREATE TABLE random_data ( col1 int PRIMARY KEY, col2 int, col3 char(15) ) GO DECLARE @counter int, @col2 int, @col3 char(15) /* Insert 100 rows of data */ -- Seed random generator
SELECT @counter=0, @col2=RAND(@@spid + cpu + physical_io) FROM master..sysprocesses where spid=@@spid WHILE (@counter < 1000) BEGIN SELECT @counter=@counter + 10, -- Sequence numbers by 10
@col2= CASE -- Random integer between -9999 and 9999
WHEN CONVERT(int, RAND() * 1000) % 2 = 1 THEN (CONVERT(int, RAND() * 100000) % 10000 * -1) ELSE CONVERT(int, RAND() * 100000) % 10000 END, @col3= -- Four random letters followed by random fill letter
CHAR((CONVERT(int, RAND() * 1000) % 26 ) + 65) -- 65 is 'A'
+ CHAR((CONVERT(int, RAND() * 1000) % 26 ) + 65) + CHAR((CONVERT(int, RAND() * 1000) % 26 ) + 65) + CHAR((CONVERT(int, RAND() * 1000) % 26 ) + 65) + REPLICATE(CHAR((CONVERT(int, RAND() * 1000) % 26 ) + 65), 11) INSERT random_data VALUES (@counter, @col2, @col3) END GO SELECT * FROM random_data WHERE COL1 < 200 col1 col2 col3 ---- ----- ---------------
10 -5240 LXDSGGGGGGGGGGG 20 9814 TTPDOOOOOOOOOOO 30 3004 IEYXEEEEEEEEEEE 40 -9377 MITDAAAAAAAAAAA 50 -3823 ISGMUUUUUUUUUUU 60 -4249 DHZQQQQQQQQQQQQ 70 2335 XBJKEEEEEEEEEEE 80 -4570 ILYWNNNNNNNNNNN 90 4223 DHISDDDDDDDDDDD 100 -3332 THXLWWWWWWWWWWW 110 -9959 ALHFLLLLLLLLLLL 120 4580 BCZNGGGGGGGGGGG 130 6072 HRTJOOOOOOOOOOO 140 -8274 QPTKWWWWWWWWWWW 150 8212 FBQABBBBBBBBBBB 160 8223 YXAPLLLLLLLLLLL 170 -9469 LIHCAAAAAAAAAAA 180 -2959 GYKRZZZZZZZZZZZ 190 7677 KWWBJJJJJJJJJJJ
14 май 04, 14:20    [679044]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая случайную строку.  [new]
mr.first
Member

Откуда:
Сообщений: 16
Спасибо всем!
Помогли.
14 май 04, 16:08    [679543]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая случайную строку.  [new]
mcdba
Guest
может, и не по делу, но вдруг пригодится кому идея

метнул щас не глядя vbsript-код генерилки строковых паролей в T-SQL

declare @intRdm int
declare @CharCount int
declare @NumChar int
declare @strRdm varchar(20)

SET @NumChar = 8
SET @CharCount = 0
SET @strRdm = space(0)

WHILE @CharCount < @NumChar
BEGIN
  SET @CharCount = @CharCount + 1
  WHILE 1 = 1
  BEGIN
    SET @intRdm = convert(int, ((122 - 49) * RAND() + 48))
    IF (@intRdm > 57 And @intRdm < 65) Or (@intRdm > 90 And @intRdm < 97)
      CONTINUE
    ELSE BREAK
  END
  SET @strRdm = @strRdm + Char(@intRdm)
END

select @strRdm
14 май 04, 19:46    [680178]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить