Quel est le moyen le plus efficace pour générer de 8 caractères alphanumériques aléatoires chaîne dans TSQL?
Je veux générer un unique de 8 caractères alphanumériques aléatoires chaîne dans TSQL, pour un mail de confirmer le lien. Nous sommes actuellement en utilisant un GUID mais il n'est pas très convivial.
Elle n'a qu'à obéir à quelques règles:
- être composé de 8 Caractères
- être unique
- être généré de manière efficace
Ne
Question similaire: [1]: stackoverflow.com/questions/2520794/...
Je pensais la même chose, mais ceux-ci vont très souvent les mêmes numéros et ils ne sont pas randomisés
LEFT(NEWID(),8)
pas faire ce que vous avez besoin? (En conjonction avec une contrainte unique)Question similaire: [1]: stackoverflow.com/questions/2520794/...
Je pensais la même chose, mais ceux-ci vont très souvent les mêmes numéros et ils ne sont pas randomisés
OriginalL'auteur Korich | 2011-08-03
Vous devez être connecté pour publier un commentaire.
Voici 2 façons de le résoudre
Méthode 1: Cela va générer de 8 caractères au hasard et de les stocker dans varchar @r, afin de prévenir tous les caractères individuels d'être identiques, j'ai ajouté une graine à RAND().
Méthode 2: Cette méthode est à l'aide d'un tableau de pointage, chaque personnage va jamais se produire plus d'une fois. Les lignes utilisées pour générer ces caractères sont randomisés en commandant sur newid()
Afin de garantir l'unicité de chaque type varchar(8) vous pouvez stocker les résultats dans un tableau et de le comparer avec le résultat dans le tableau. Vous pouvez également faire de la varchar plus et espérer pour le mieux
RAND(ABS(CHECKSUM(NEWID()))
va tomber plus d'une fois tous les 4 milliards de fois il l'appelle. Le problème est que lorsque la somme de contrôle produit le plus négatif possible int (-2147483648) et que la valeur est introduit dans la fonction ABS. La plus positive possible int 2 147 483 647. Il en résulte un dépassement de capacité arithmétique. docs.microsoft.com/en-us/sql/t-sql/functions/...Ma solution a été de cette expression
RAND(Utilities.CapForRand(ABS(CAST(BINARY_CHECKSUM(NEWID()) as bigint)))
Casting de la suite de la BINARY_CHECKSUM à un bigint est le dépassement de capacité arithmétique en ABS comme le bigint tiendra 2147483648 et de l'ABS va dans bigint mode lorsqu'il est passé d'un bigint. Cependant RAND implique un int donc j'ai écrit une fonction qui prend un bigint, si elle est plus grande que la plus positive possible int ensuite, il retourne la plus positive possible int, sinon, elle retourne la valeur d'un int.OriginalL'auteur t-clausen.dk
En raison de la manière que
SUBSTRING
fonctionne,0,7
produira 6 pas 8 caractères. À l'aide de1,8
vous donnera le 8cela permettra de convertir 8 les nombres hexadécimaux à un varchar. Il permettra d'éliminer le reste de l'alphabet
OriginalL'auteur Igor Be
Vous pouvez utiliser
CHAR(ROUND(RAND() * 93 + 33, 0))
pour générer un caractère aléatoire.Alors regardez pour voir si c'est l'un des personnages que vous pouvez rejeter, comme les apostrophes, peut-être, alors construire votre chaîne, à faire tout ça dans une boucle.
Vous êtes presque sûr d'obtenir des caractères non alphanumériques avec ce script, si vous l'utilisez dans mon premier exemple, vous obtenez 8 caractères identiques.
OriginalL'auteur James Black