2009-04-21 15 views
43

Devo inserire una colonna falsa al risultato di una query, che è il valore di ritorno di una funzione valore di tabella. Questo tipo di dati di colonna deve essere un identificatore univoco. Il modo migliore (penso ...) è usare la funzione newid(). Il problema è, non posso utilizzare newid() all'interno di questo tipo di funzione:newid() all'interno della funzione sql server

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

Le funzioni non possono contenere operatori non deterministici. Puoi pubblicare la tua definizione di funzione? –

risposta

3

usano come predefinito invece

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

insert test(id2) values(1) 

select * from test 

NB ho usato NEWSEQUENTIALID() anziché newid() dal newid () causerà pagesplits dal momento che non è sequenziale, vedere qui: Some Simple Code To Show The Difference Between Newid And Newsequentialid

+1

... solo se l'indice cluster è basato su di esso ... –

+1

sì, sfortunatamente alcune persone lo rendono un PK senza rendersi conto che è in cluster .... credetemi ho visto molti esempi simili – SQLMenace

12

È possibile passare NEWID() come parametro per la funzione.

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 

Chiamare la funzione in questo modo;

SELECT dbo.SOMEIDFUNCTION(NewID(),NewID()) 
Problemi correlati