Existe-t-il un moyen de générer des nombres uniques (int par exemple) dans une fonction définie par l'user?
rand () et newid () ne fonctionnent pas en raison d'effets secondaires.
Merci.
CRYPT_GEN_RANDOM contourne la limitation NEWID ()
SELECT CHECKSUM(CRYPT_GEN_RANDOM(8000))
Donc vous pouvez l'utiliser comme ça. Aucune erreur "affectant le côté"
CREATE FUNCTION dbo.test () RETURNS int AS BEGIN RETURN CHECKSUM(CRYPT_GEN_RANDOM(8000)) END GO SELECT dbo.test()
Dans DB2, j'utilise la partie microsecondes de l'horodatage, mais le server SQL ne passe qu'en millisecondes. Je suppose que ce ne serait pas suffisant?
affichant une solution de contournement conviviale que j'ai utilisée. J'ai écrit un proc standalone pour returnner un int random en utilisant la méthode NewId
CREATE PROCEDURE sp_RandUpTo @max int AS BEGIN declare @return int SET NOCOUNT ON; SELECT @return = abs(checksum(newid())) % (@max) return @return END
puis exécutez le proc dans la variable désirée au sein de votre FDU
declare @OptionSelect int, @OptionMax int = 100 exec @OptionSelect = spRandUpTo @OptionMax
Vous pouvez également définir une vue en utilisant la fonction qui provoque l'effet secondaire (dans ce cas, RAND ())
CREATE VIEW randomView AS SELECT RAND() randomResult GO
Ensuite, utilisez la vue dans votre FDU
DECLARE @random DECIMAL(18,18) SELECT @random = randomResult FROM randomView RETURN @random