2010-02-02 28 views
9

Bu hatayı almaya devam ediyorum: Herhangi bir Fikir?newID kullanarak işlevi oluşturma()

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

MS-SQL Server 2005 ile çalışıyorum. İşte T-SQL ifadedir:

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 

cevap

8

işlevi NewID kullanmasına izin vermez, ancak bu çevrede çalışılan. planlandığı gibi

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 

Sonra select dbo.[GetNewNumber]() kullanabilirsiniz.

+0

iki kez oluşturuluyor kullanabilirsiniz veya Bu astronomik şanslar ??? –

+0

Bunlar, olasılık ihtimalinin ötesinde değil, yalnızca rastgele bir şansla yapılan 100 milyonluk bir maksimum sayıdır. Doğum günü problem teorisine göre, bir maç şansınız beklediğinizden daha çabuk gelecektir. – Andrew

+0

+1, iyi bir geçici çözüm. Her ne kadar savunma kodlaması olsa da, bu durumda 'ilk 1' gereksiz görünmektedir ve hiç olmadığı kadar yavaştır. –

10

Bir işlev içinde NEWID() kullanamazsınız. gibi

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 

Ve diyoruz:

SELECT dbo.GetNewNumber(NEWID()) 
2

İşe Yarar

bir olağan geçici çözüm (Tecrübelerime göre daha GETDATE ihtiyacını oldu()) içinde geçmek zorunda olmaktır Bunun bir işlev çağrısı ile yapılması gerekiyor? Bu işlevi ihtiyacı olduğunda, ben sadece kullanın: Bu negatif sayılar üretecektir

checksum(newid()) 

- onlar pozitif olmalıdır, sen ben aynı sayıda dert

abs(checksum(newid())) 
İlgili konular