我有一个UDF从表中选择前6个对象(下面是union - 代码)并将其插入另一个表中。 (顺便说一下,SQL 2005)
所以我粘贴下面的UDF以及代码的作用是什么:
我的问题是,我想随机选择从表欧洲获取随机对象,但因为我将我的选择结果插入表中,我不能使用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()订购或添加带有种子DateTime(按ms或sthg)的列rand(),因为这不起作用。)
答案 0 :(得分:2)
也许您可以通过在输入中添加位置参数然后传入随机生成的值然后按子串排序(internalID,@ Random,1)来利用guid
答案 1 :(得分:2)
我自己找到了一个很好的解决方案,我认为分享它可能很方便:)
DECLARE @seed1 int
DECLARE @seed2 int
SET @seed1 = DATEPART(SECOND,GETDATE())
SET @seed2 = DATEPART(MILLISECOND,GETDATE())
SELECT TOP 10 [Column1], [Column2]
FROM [TABLE]
ORDER BY ROW_NUMBER() OVER (ORDER BY [KeyColumn]) * seed2 % seed1
我认为这很简单,而且非常方便
答案 2 :(得分:0)
您使用的是哪个版本的数据库服务器?
在SQL Server 2005中,您可以将rand
与getdate
一起用作种子,并且该函数将变得不确定。
在早期版本中,您不能拥有不确定的函数,而是必须使用存储过程。