62 votes

newid () dans la fonction serveur sql

Je dois insérer une fausse colonne au résultat d'une requête, qui est la valeur de retour d'une fonction de valeur de table. Ce type de données de colonne doit être un identifiant unique. La meilleure façon (je pense ...) est d'utiliser la fonction newid() . Le problème est que je ne peux pas utiliser newid() dans ce type de fonction:

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

115voto

Don Dickinson Points 4208

voici une solution intelligente:

 create view getNewID as select newid() as new_id

create function myfunction ()
returns uniqueidentifier
as begin
   return (select new_id from getNewID)
end
 

que je ne peux pas prendre de crédit. je l'ai trouvé ici: http://omnibuzz-sql.blogspot.com/2006/07/accessing-non-deterministic-functions.html

-Don

21voto

Daniel de Zwaan Points 172

Vous pouvez passer NEWID () comme paramètre à votre fonction.

 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
 

Appelez la fonction comme ceci;

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

5voto

SQLMenace Points 68670

utilisez-le par défaut à la place

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

insert test(id2) values(1)

select * from test
 

NB J'ai utilisé newsequentialid () au lieu de newid () car newid () provoquera des pagesplits car il n'est pas séquentiel, voir ici: Un code simple pour montrer la différence entre Newid et Newsequentialid

-7voto

João Vieira Points 822

Vous pouvez utiliser la fonction ROW_NUMBER:

SÉLECTIONNER
(ROW_NUMBER () OVER (ORDER BY recordID)) comme RowNumber,
recordID,
fieldBla1
FROM tableName

Trouvez plus d'informations sur http://msdn.microsoft.com/pt-br/library/ms186734.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X