2009-04-21 35 views
43

Tengo que insertar una columna falsa en el resultado de una consulta, que es el valor de retorno de una función de valor de tabla. Este tipo de datos de columna debe ser unique-identifier. La mejor manera (creo ...) es usar la función newid(). El problema es, no puedo usar newid() dentro de este tipo de función:newid() dentro de la función de servidor sql

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

Las funciones no pueden contener operadores no deterministas. ¿Puedes publicar tu definición de función? –

Respuesta

3

lo utilizan como un defecto en lugar

create table test(id uniqueidentifier default newsequentialid(),id2 int) 

insert test(id2) values(1) 

select * from test 

NB Solía ​​newsequentialid() en lugar de newid() desde newid () hará que pagesplits ya que no es secuencial, ver aquí: Some Simple Code To Show The Difference Between Newid And Newsequentialid

+1

... solo si el índice agrupado está basado en él ... –

+1

sí, desafortunadamente algunas personas lo convierten en PK sin darse cuenta de que está agrupado ... créanme que he visto muchas de esas instancias – SQLMenace

12

Puede pasar NEWID() como un parámetro a su función.

CREATE FUNCTION SOMEIDFUNCTION 
(
    @NEWID1 as varchar(36), @NEWID2 as varchar(36) 
) 
RETURNS varchar(18) 
AS 
BEGIN 
    -- Do something -- 
    DECLARE @SFID varchar(18) 
    SELECT @SFID = 'DYN0000000' + LOWER(LEFT(@NEWID1,4)) + LEFT(@NEWID2,4) 
    RETURN @SFID 
END 
GO 

Llame a la función como ésta;

SELECT dbo.SOMEIDFUNCTION(NewID(),NewID()) 
Cuestiones relacionadas