Что-то совсем запутался
Как написать на T-SQL скалярную функцию, возвращающую одну случайную запись из запроса типа
select id from tbl1
Пытался получать количество записей в таблице, затем открывал курсор и читал случайное число записей, последнее сохранял. Вот только ничего не работает почему-то
Здравствуйте, ghost_07, Вы писали:
_>Что-то совсем запутался _>Как написать на T-SQL скалярную функцию, возвращающую одну случайную запись из запроса типа _>select id from tbl1
_>Пытался получать количество записей в таблице, затем открывал курсор и читал случайное число записей, последнее сохранял. Вот только ничего не работает почему-то
а как ты читал читал случайное число записей в функции? UDF по определению deterministic
потом если ты хочешь возвратить запись, то это уже не скалярная функция. но в твоем случае сойдет — там всего одно поле
я бы передавал случайное число [0..1] в функцию и по нему возвращал запись
как-то так
create dbo.GetRandId(@rnd float) returns int
as
declare @id_min int
declare @id_max int
select @id_min = min(in), @id_max = max(id) from tbl1
declare @id_rnd int
select @id_rnd = min(id) from tbl1 where id >= @id_min + (@id_max - @id_min) * @rnd
return @id_rnd
если уверен, что пробелов в таблице среди id нет, то можно сразу вернуть @id_min + (@id_max — @id_min) * @rnd
--
с другой стороны я не уверен, что понял вопрос
Здравствуйте, ghost_07, Вы писали:
_>Что-то совсем запутался _>Как написать на T-SQL скалярную функцию, возвращающую одну случайную запись из запроса типа _>select id from tbl1
_>Пытался получать количество записей в таблице, затем открывал курсор и читал случайное число записей, последнее сохранял. Вот только ничего не работает почему-то
Скалярная фнкция не может возвращать ЗАПИСЬ!
Так как NEWID() нельзя использовать в функции, то:
CREATE VIEW MyNewID AS
SELECT NEWID() New_ID
GO
CREATE FUNCTION RandomObjectID()
RETURNS int AS
BEGIN
RETURN (
SELECT TOP 1
object_id
FROM
sys.objects
ORDER BY
(SELECT New_ID FROM MyNewID))
END
GO
SELECT dbo.RandomObjectID()
GO
DROP FUNCTION RandomObjectID
DROP VIEW MyNewID
GO
Здравствуйте, ilya_ny, Вы писали:
_>если уверен, что пробелов в таблице среди id нет, то можно сразу вернуть @id_min + (@id_max — @id_min) * @rnd _>-- _>с другой стороны я не уверен, что понял вопрос
В конечном счете я написал так:
CREATE FUNCTION [dbo].[funcLaunch](@rnd_val float)
RETURNS int
AS-- Returns the stock level for the product.BEGIN
declare @cur cursor
set @cur = cursor for select kod from qlaunch
open @cur
declare @cur_val int
declare @prev_val int
fetch next from @cur into @cur_val
set @prev_val = @cur_val
declare @cond int
set @cond = 0
declare @total_records int
select @total_records = count(kod) from qlaunch
declare @rand_num int
set @rand_num = round((@total_records + 1) * @rnd_val, 0)
while @cond < @rand_num
begin
set @cond = @cond + 1
set @prev_val = @cur_val
fetch next from @cur into @cur_val
end
return @prev_val
END;
Здравствуйте, _d_m_, Вы писали:
_>>а как ты читал читал случайное число записей в функции? UDF по определению deterministic
___>Поясни.
ее поведение детерминировано — при одни и тех же входных параметрах одни и те же выходные параметры.
таким образом возвращать что-то случайное она в принципе не может.
Здравствуйте, ilya_ny, Вы писали:
_>Здравствуйте, _d_m_, Вы писали:
_>>>а как ты читал читал случайное число записей в функции? UDF по определению deterministic
___>>Поясни.
_>ее поведение детерминировано — при одни и тех же входных параметрах одни и те же выходные параметры. _>таким образом возвращать что-то случайное она в принципе не может.
RTFM или, стало модно говорить — учи матчасть.
create function dbo.MyNonDeterministicFunction(
@param int
)
returns datetime
as begin
return dateadd(hour, @param, getdate());
end
GO
select objectpropertyex(object_id(N'dbo.MyNonDeterministicFunction'), N'isdeterministic')
GO
drop function dbo.MyNonDeterministicFunction
Здравствуйте, _d_m_, Вы писали:
_>>ее поведение детерминировано — при одни и тех же входных параметрах одни и те же выходные параметры. _>>таким образом возвращать что-то случайное она в принципе не может.
___>RTFM или, стало модно говорить — учи матчасть.
___>
___>create function dbo.MyNonDeterministicFunction(
___> @param int
___>)
___>returns datetime
___>as begin
___> return dateadd(hour, @param, getdate());
___>end
___>GO
___>select objectpropertyex(object_id(N'dbo.MyNonDeterministicFunction'), N'isdeterministic')
___>GO
___>drop function dbo.MyNonDeterministicFunction
___>
я не знаю что такое "матчасть", зато я и без проверки знаю, что это под sql 2000 работать не будет:
Built-in nondeterministic functions are not allowed in the body of user-defined functions.
_>>>ее поведение детерминировано — при одни и тех же входных параметрах одни и те же выходные параметры. _>>>таким образом возвращать что-то случайное она в принципе не может.
___>>RTFM или, стало модно говорить — учи матчасть.
_>я не знаю что такое "матчасть", зато я и без проверки знаю, что это под sql 2000 работать не будет:
Ну RTFM то уж знаешь что такое?
_>
_>Built-in nondeterministic functions are not allowed in the body of user-defined functions.
Ну так и уточняй тогда, что данная информация верна для устаревшей версии SQL Server — 2000.