使用newID()创建函数

10

我一直收到这个错误:有什么想法吗?

在函数中使用了副作用或时间依赖操作符 'newid',这是无效的。

我正在使用 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
3个回答

11

你不能在函数中使用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())

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


我需要担心同样的数字被生成两次吗?还是这种情况非常罕见? - WingMan20-10
它们并不是完全不可能的事情,只有最多1亿个数字可用,纯粹是随机概率。根据生日问题理论,你会比预期更快地遇到匹配的机会。 - Andrew
+1,好的解决方法。虽然这可能是一种防御性编程,但在这种情况下,“top 1”似乎是不必要的,并且比没有它稍微慢一点。 - Tim Lehner

2

这个功能必须通过函数调用来完成吗?每当我需要这个功能时,我只需使用:

checksum(newid())

这将生成负数 -- 如果必须为正数,您可以使用
abs(checksum(newid()))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接