Return 使用 SQL 服务器中的函数的随机行号

Return a random row number using a function in SQL Server

我正在尝试编写一个函数,从 table 和 return 中随机选择一组行。该函数的第一步创建并填充一个本地 table 变量,其中包含 suitable 行 ID。 table 定义如下:

DECLARE @SuitableID TABLE (
  Id INT
)

这个 table 可以容纳任意数量的 ID。该函数需要随机 return 其中之一,但我不知道该怎么做。我尝试了以下方法:

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

哪个 return 是一个错误:

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'.

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

    select CAST(CRYPT_GEN_RANDOM(8) AS bigint)

这会选择一个随机数,所以我不知道您是否可以将其合并到

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

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

然后您可以将它与您的 UDF 中的 table 结合起来,如下所示:

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

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

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()