2017-09-15 150 views
0

我正在嘗試編寫一個函數,用於從表中選擇一組行並隨機返回其中之一。該函數的第一步創建並填充本地表變量,該變量包含合適的行ID。該表定義如下:使用SQL Server中的函數返回一個隨機的行號

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

我在做什麼錯,我該如何執行我想要的操作?

+5

檢查這個問題:https://stackoverflow.com/questions/772517/newid-inside-sql-server-function –

回答

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; 
+0

感謝Nenad的評論,我已經被放在這個軌道上。這確實是一個可行的解決方案。 –

+0

有趣。我有類似的看法,但從來沒有考慮過將它們合併+1 –

0
select CAST(CRYPT_GEN_RANDOM(8) AS bigint) 

這將選擇一個隨機數,所以我不知道你是否可以將這個在

+0

這將返回相同的錯誤使用'NEWID()' :在函數中無效使用副作用運算符'Crypt_Gen_Random'。 –

+0

創建它作爲一個函數,然後叫它 –

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() 
相關問題