newid () dans la fonction sql server

je dois insérer une fausse colonne au résultat d'une requête, qui est la valeur de retour d'une fonction table-value. Ce type de données de colonne doit être unique identificateur. La meilleure façon (je pense...) est d'utiliser newid() fonction. 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.
45
demandé sur Gaffi 2009-04-21 17:11:16

4 réponses

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

Je ne peux pas m'en attribuer le mérite. je l'ai trouvé ici: http://omnibuzz-sql.blogspot.com/2006/07/accessing-non-deterministic-functions.html

-ne

83
répondu Don Dickinson 2009-04-22 03:15:04

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

Appeler la fonction comme ceci:

SELECT dbo.SOMEIDFUNCTION(NewID(),NewID())
14
répondu Daniel de Zwaan 2012-09-12 23:57:53

utiliser comme un 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() depuis newid() entraîner pagesplits car il n'est pas séquentielle, voir ici: Un Code Simple Pour Montrer La Différence Entre Newid Et Newsequentialid

3
répondu SQLMenace 2009-04-21 13:16:50

vous pouvez utiliser la fonction ROW_NUMBER:

sélectionner

(ROW_NUMBER () OVER (ORDER BY recordID) ) as RowNumber ,

recordID,

fieldBla1

De tableName

pour en savoir plus, allez à http://msdn.microsoft.com/pt-br/library/ms186734.aspx

-3
répondu João Vieira 2009-04-21 13:19:28