我试图编写一个从表中选择一组行并随机返回其中一行的函数。该函数的第一步创建并填充包含合适行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'.
我做错了什么,我该如何进行我想要的操作?
答案 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()