使用SQL Server中的函数返回随机行号

时间:2017-09-15 11:58:12

标签: sql sql-server tsql random sql-function

我试图编写一个从表中选择一组行并随机返回其中一行的函数。该函数的第一步创建并填充包含合适行ID的本地表变量。该表定义如下:

DECLARE @SuitableID TABLE (
  Id INT
)

此表可以包含任意数量的ID。该函数需要随机返回其中一个,但我无法找到如何做到这一点。我尝试过以下方法:

DECLARE @ReturnedID INT
SELECT TOP 1 @ReturnedID = Id
FROM @SuitableID
ORDER BY NEWID()

返回错误:

Invalid use of a side-effecting operator 'newid' within a function.

TAMPLESAMPLE似乎也不起作用:

SELECT @ReturnedID = Id
FROM @SuitableID
TABLESAMPLE (1 ROWS)

我认为这种语法是正确的,但我的数据库不同意。

Incorrect syntax near the keyword 'TABLESAMPLE'.

我做错了什么,我该如何进行我想要的操作?

3 个答案:

答案 0 :(得分:2)

对于这种情况和类似情况,我通常在数据库中有一个特殊的视图:

create view [dbo].[sys_ViewNDF]
as
select rand() as [Rnd], getdate() as [Now], getutcdate() as [UTCNow], newid() as [GUID];

然后,您可以将其与UDF中的表格连接,如下所示:

SELECT TOP (1) @ReturnedID = s.Id
FROM @SuitableID s
  cross join dbo.sys_ViewNDF v
ORDER BY v.GUID;

答案 1 :(得分:0)

    select CAST(CRYPT_GEN_RANDOM(8) AS bigint)

这会选择一个随机数,所以我不知道你是否可以将其纳入

答案 2 :(得分:0)

这对你有用吗?至少它有效:)

CREATE VIEW dbo.GetNewID
AS
SELECT NewId() AS [NewID]
GO


CREATE FUNCTION GetRandomID()
RETURNS INT
AS
BEGIN

DECLARE @SuitableID TABLE (
Id INT
)

insert into @SuitableID (ID)
values(1),(2),(3)
RETURN (
 SELECT TOP 1 ID
 FROM @SuitableID
 ORDER BY (SELECT [NewId] FROM GetNewID)
)
END
GO

SELECT dbo.GetRandomID()