use*_*744 3 sql-server-2008 sql-server stored-procedures
我有一个存储过程,每天早上为呼叫中心系统生成数据。但是,数据每天以相同的顺序发送。有没有办法每天以不同的顺序发送一天而无需手动更改 where 子句?例如今天的数据是:1,2,3 明天的将是:3,2,1 后一天 2,1,3 .. 相同的数据每天不同的顺序。
假设您想要对输出进行随机排序,您只需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)