2010-02-02 99 views
9

我不斷收到此錯誤:任何想法?使用newID創建函數()

Invalid use of side-effecting or time-dependent operator in 'newid' within a function.

我正在與MS-SQL Server 2005一起工作。這裏是T-SQL聲明:

Create Function [dbo].[GetNewNumber]() 
RETURNS int 
AS 
BEGIN 

    Declare @code int 

    set @code = (SELECT CAST(CAST(newid() AS binary(3)) AS int)) 

    RETURN (@code) 
END 

回答

8

該函數不會讓你使用NewID,但這可以解決。

Create View vwGetNewNumber 
as 
Select Cast(Cast(newid() AS binary(3)) AS int) as NextID 

Create Function [dbo].[GetNewNumber] () RETURNS int 
AS 
BEGIN 
Declare @code int 
Select top 1 @code=NextID from vwGetNewNumber 
RETURN (@code) 
END 

然後你可以按照計劃使用select dbo.[GetNewNumber]()

+0

我應該擔心同樣數量產生兩次或這些機會是天文嗎? – 2010-02-02 19:08:20

+0

它們不是超越可能性的領域,只有最多1億個可用數字,完全由隨機機會完成。通過生日問題理論,你的比賽機會將比你預期的更早。 – Andrew 2010-02-02 20:24:47

+0

+1,很好的解決方法。雖然它可能是防守性編碼,但在這種情況下,「頂部1」看起來沒有必要,並且比沒有更慢。 – 2012-11-05 20:19:25

10

您不能在函數中使用NEWID()。

一個通常的解決方法(在我的經驗,它更被需要GETDATE())是必須把它傳遞:

Create Function [dbo].[GetNewNumber](@newid UNIQUEIDENTIFIER ) 
RETURNS int 
AS 
BEGIN 

    Declare @code int 

    set @code = (SELECT CAST(CAST(@newid AS binary(3)) AS int)) 

    RETURN (@code) 
END 

,並調用它像:

SELECT dbo.GetNewNumber(NEWID()) 
2

不這必須通過函數調用來完成?每當我需要這個功能,我只需使用:

checksum(newid()) 

這將產生負數 - 如果他們必須爲正數,你可以使用

abs(checksum(newid()))