SQL:将对象插入表时随机排序

时间:2009-10-09 11:30:23

标签: sql tsql

我有一个UDF从表中选择前6个对象(下面是union - 代码)并将其插入另一个表中。 (顺便说一下,SQL 2005)

所以我粘贴下面的UDF以及代码的作用是什么:

  • 选择特定城市的对象并为其添加级别(来自欧洲表格)
  • 将选择与来自同一国家/地区的对象的同一表中的选择结合起来并为这些选项添加级别
  • 从联合中选择,按级别排序前六个对象,因此来自同一城市的对象将是第一个,如果没有任何可用,则来自同一国家/地区的对象将从选择。

我的问题是,我想随机选择从表欧洲获取随机对象,但因为我将我的选择结果插入表中,我不能使用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()订购或添加带有种子DateTime(按ms或sthg)的列rand(),因为这不起作用。)

3 个答案:

答案 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中,您可以将randgetdate一起用作种子,并且该函数将变得不确定。

在早期版本中,您不能拥有不确定的函数,而是必须使用存储过程。