打乱存储过程的数据输出

use*_*744 3 sql-server-2008 sql-server stored-procedures

我有一个存储过程,每天早上为呼叫中心系统生成数据。但是,数据每天以相同的顺序发送。有没有办法每天以不同的顺序发送一天而无需手动更改 where 子句?例如今天的数据是:1,2,3 明天的将是:3,2,1 后一天 2,1,3 .. 相同的数据每天不同的顺序。

Eri*_*rik 5

假设您想要对输出进行随机排序,您只需ORDER BY NEWID(). 这会相当好地混淆结果的排序。如果您只需要在建立某个顺序后进行随机化,那么您仍然可以使用该NEWID()技巧。以下是一些快速示例:

-- Fully random ordering
SELECT
    *
FROM dbo.Foo F
    INNER JOIN dbo.Bar B ON B.Id = F.FkId
WHERE
    B.ImportantFilter > @ImpressiveVariable
ORDER BY
    NEWID() ;

-- Random ordering of results but the results still preserve the order of UserId
SELECT
    *
FROM dbo.Foo F
    INNER JOIN dbo.Bar B ON B.Id = F.FkId
WHERE
    B.ImportantFilter > @ImpressiveVariable
ORDER BY
    F.UserId
    , NEWID() ;
Run Code Online (Sandbox Code Playgroud)

另一种方法,它不会产生所有可能的排序,而只会产生一个有限的集合,但对于大表可以更有效,因为它不使用NEWID(),只@aRandomNumber应从与之进行比较的列的范围中提取一个值(F.UserId这里) :

WITH cte AS
  ( SELECT *, 0 AS ord
    FROM dbo.Foo F
        INNER JOIN dbo.Bar B ON B.Id = F.FkId
    WHERE ( <where conditions> )
      AND F.UserId >= @aRandomNumber
    ORDER BY F.UserId
  UNION ALL
    SELECT *, 1 AS ord
    FROM dbo.Foo F
        INNER JOIN dbo.Bar B ON B.Id = F.FkId
    WHERE ( <where conditions> )
      AND F.UserId < @aRandomNumber
    ORDER BY F.UserId
  )
SELECT <list of columns except the "ord">
FROM cte
ORDER BY ord, UserId ;
Run Code Online (Sandbox Code Playgroud)