2017-09-15 21 views
0

テーブルから行のセットを選択し、これらのうちの1つをランダムに返す関数を作成しようとしています。関数の最初のステップは、適切な行IDを保持するローカル表変数を作成して入力します。テーブルは次のように定義されます。SQL Serverの関数を使用してランダムな行番号を返します。

DECLARE @SuitableID TABLE (
    Id INT 
) 

このテーブルは、任意の数のIDを保持できます。関数は、これらのうちの1つをランダムに返す必要がありますが、それを行う方法を見つけることはできません。私はこの構文が正しいことだと思う

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

、しかし:

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

TAMPLESAMPLEも動作していないよう:

エラーを返し
DECLARE @ReturnedID INT 
SELECT TOP 1 @ReturnedID = Id 
FROM @SuitableID 
ORDER BY NEWID() 

:私は次のことを試してみました私のデータベースは同意しない。

私は間違っていますが、私はどのように操作したいのですか?

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

あなたは

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

と呼んでください。Nenadのコメントのおかげで、私はすでにこのトラックに乗っていました。これは確かに実用的な解決策です。 –

+0

興味深い。私は似たような見解を持っていますが、それらを組み合わせることを考えた –

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() 
関連する問題