У меня есть UDF, который выбирает 6 лучших объектов из таблицы (с кодом объединения ниже) и вставляет его в другую таблицу. (кстати SQL 2005)
Итак, я вставляю UDF ниже и код выглядит так:
- выбирает объекты для определенного города и добавляет к ним уровень (из таблицы Европа)
- объединяет этот выбор с выбором из той же таблицы для объектов из той же страны и добавляет уровень к этим
- Из объединения сделан выбор, чтобы получить 6 лучших объектов, упорядочить по уровням, поэтому объекты из того же города будут первыми, а если их нет, то объекты из той же страны будут возвращены из выбор.
И моя проблема в том, что я хочу сделать случайный выбор, чтобы получить случайные объекты из таблицы Europe, но, поскольку я вставляю результат своего выбора в таблицу, я не могу использовать order by newid () или rand ( ), потому что они зависят от времени, поэтому я получаю следующие ошибки:
- Неправильное использование побочного или зависящего от времени оператора в 'newid' внутри функции.
- Неправильное использование побочного или зависящего от времени оператора в 'rand' внутри функции.
UDF:
ALTER FUNCTION [dbo].[Objects] (@id uniqueidentifier)
RETURNS @objects TABLE
(
ObjectId uniqueidentifier NOT NULL,
InternalId uniqueidentifier NOT NULL
)
AS
BEGIN
declare @city varchar(50)
declare @country int
select @city = city,
@country = country
from Europe
where internalId = @id
insert @objects
select @id, internalId from
(
select distinct top 6 [level], internalId from
(
select top 6 1 as [level], internalId
from Europe N4
where N4.city = @city
and N4.internalId != @id
union select top 6 2 as [level], internalId
from Europe N5
where N5.countryId = @country
and N5.internalId != @id
) as selection_1
order by [level]
) as selection_2
return
END
Если у вас есть свежие идеи, поделитесь ими со мной.
(Только, пожалуйста, не предлагайте заказывать по newid () или добавлять столбец rand () с семенем DateTime (по ms или sthg), потому что это не сработает.)