2010-02-02 100 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()))