Re[4]: Скалярная функция
От: _d_m_  
Дата: 28.06.08 08:58
Оценка: -1
Здравствуйте, 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
Скалярная функция
От: ghost_07  
Дата: 26.06.08 21:12
Оценка:
Что-то совсем запутался
Как написать на T-SQL скалярную функцию, возвращающую одну случайную запись из запроса типа
select id from tbl1

Пытался получать количество записей в таблице, затем открывал курсор и читал случайное число записей, последнее сохранял. Вот только ничего не работает почему-то
Re: Скалярная функция
От: ilya_ny  
Дата: 27.06.08 02:08
Оценка:
Здравствуйте, 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
--
с другой стороны я не уверен, что понял вопрос
Re: Скалярная функция
От: pkarklin  
Дата: 27.06.08 06:03
Оценка:
Здравствуйте, 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
Re[2]: Скалярная функция
От: ghost_07  
Дата: 27.06.08 07:02
Оценка:
Здравствуйте, 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;


Всем большое спасибо!
Re[2]: Скалярная функция
От: _d_m_  
Дата: 27.06.08 07:36
Оценка:
Здравствуйте, ilya_ny, Вы писали:

_>а как ты читал читал случайное число записей в функции? UDF по определению deterministic


Поясни.
Re[3]: Скалярная функция
От: ilya_ny  
Дата: 27.06.08 12:05
Оценка:
Здравствуйте, _d_m_, Вы писали:

_>>а как ты читал читал случайное число записей в функции? UDF по определению deterministic


___>Поясни.


ее поведение детерминировано — при одни и тех же входных параметрах одни и те же выходные параметры.
таким образом возвращать что-то случайное она в принципе не может.
Re[5]: Скалярная функция
От: ilya_ny  
Дата: 29.06.08 12:18
Оценка:
Здравствуйте, _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.

Re[6]: Скалярная функция
От: _d_m_  
Дата: 29.06.08 20:51
Оценка:
Здравствуйте, ilya_ny, Вы писали:


_>>>ее поведение детерминировано — при одни и тех же входных параметрах одни и те же выходные параметры.

_>>>таким образом возвращать что-то случайное она в принципе не может.

___>>RTFM или, стало модно говорить — учи матчасть.


_>я не знаю что такое "матчасть", зато я и без проверки знаю, что это под sql 2000 работать не будет:


Ну RTFM то уж знаешь что такое?

_>

_>Built-in nondeterministic functions are not allowed in the body of user-defined functions.


Ну так и уточняй тогда, что данная информация верна для устаревшей версии SQL Server — 2000.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.