2010-02-02 10 views
9

Sigo recibiendo este error: ¿Alguna idea?creando la función usando newID()

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

Estoy trabajando con MS-SQL Server 2005. Aquí está la declaración 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 

Respuesta

8

La función no le permitirá utilizar el NewID, pero esto se puede evitar.

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 

continuación, puede utilizar select dbo.[GetNewNumber]() como estaba previsto.

+0

Debería preocuparme por el mismo número que se generan dos o ¿Son esas posibilidades astronómicas? –

+0

No son en absoluto los reinos de la posibilidad, solo un máximo de 100 millones de números disponibles, hechos por casualidad puramente aleatoria. Según la teoría del problema del cumpleaños, tus posibilidades de un encuentro llegarán antes de lo esperado. – Andrew

+0

+1, buena solución. Aunque puede ser una codificación defensiva, el 'top 1' parece innecesario en este caso y es muy ligeramente más lento que sin él. –

10

No puede usar NEWID() dentro de una función.

Una solución habitual (en mi experiencia, es más ha sido la necesidad de GETDATE()) es tener que pasarlo en:

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 

Y llamar así:

SELECT dbo.GetNewNumber(NEWID()) 
2

¿El esto tiene que hacerse con una llamada de función? Cada vez que necesita esta funcionalidad, sólo tiene que utilizar:

checksum(newid()) 

Esto generará los números negativos - si es que han de ser positivas, podría utilizar

abs(checksum(newid())) 
Cuestiones relacionadas