2017-09-15 10 views
0

테이블에서 행 집합을 선택하고이 중 하나를 임의로 반환하는 함수를 작성하려고합니다. 함수의 첫 x 째 단계는 적절한 행 ID를 보유하는로 C 테이블 변수를 작성하고 채 웁니다. 표는 다음과 같이 정의됩니다.SQL Server의 함수를 사용하여 임의의 행 번호를 반환하십시오.

DECLARE @SuitableID TABLE (
    Id INT 
) 

이 표에는 여러 개의 ID를 저장할 수 있습니다. 이 함수 중 하나를 무작위로 반환해야하지만이를 수행하는 방법을 찾을 수 없습니다. 내가 시도한 다음

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

나는이 구문이 올바른 생각

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

을하지만, 내 데이터베이스가 동의하지 않습니다.

Incorrect syntax near the keyword 'TABLESAMPLE'. 

내가 뭘 잘못하고 원하는 작업을 수행 할 수 있습니까?

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

당신에게 :

+5

확인이 질문 : https://stackoverflow.com/questions/772517/newid-inside-sql-server-function 이것은'NEWID를 사용하는 것과 같은 오류를 반환 –

답변

2

이 통합 할 수 있는지 잘 모릅니다 임의의 숫자를 선택하고, 나는 보통 데이터베이스의 특별한 전망을 다음과 같이 UDF 내부의 테이블에 연결할 수 있습니다.

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

이라고 부릅니다. Nenad의 의견에 감사 드리며, 이미이 트랙에 추가되었습니다. 이것은 실제로 실용적인 솔루션입니다. –

+0

흥미 롭습니다. 비슷한 견해를 가지고 있지만 +1을 결합하는 것을 결코 고려하지 않았습니다. +1 –

0
select CAST(CRYPT_GEN_RANDOM(8) AS bigint) 

이 그래서 난 당신이 유사한 경우에

+0

()' : 함수 내에서 부작용 연산자 '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()