2017-02-22 1 views
0

Ich versuche, einen eindeutigen Login-Benutzernamen für jeden Benutzer in meinem System zu generieren.Wie generiere ich einen eindeutigen Benutzernamen mit TSQL?

Was ich bisher gemacht wird:

Select p.FirstName+P.LastName + p.PersonId from person As P 

Hier 1255 ist Primary Key. Die Ausgabe ist wie JamesHarley1255, Ich möchte jedoch nicht den Primärschlüssel verwenden. Was sind andere Alternativen. Es wird auch zahlreiche Duplicate Records geben. Lets sagen, ich brauche eine Funktion, die eine eindeutige Nummer jedes Mal zwischen 1 bis n Zahlen generiert. Und irgendwie muss ich Ausgang erzeugen wie JamesHarley125

+1

Was ist die tatsächliche Anforderung? Sie benötigen eindeutige Namen in Ihrer Abfrage oder als neuen Primärschlüssel? Wenn Sie nur Vorname + Nachname kombinieren, erhalten Sie Dubletten, die Sie vermeiden möchten. Warum können Sie den Primärschlüssel nicht hinzufügen? Warum kannst du 'DISTINCT' nicht verwenden, was ist das Ziel? –

+0

Ich brauche einen eindeutigen Benutzernamen, ohne den Primärschlüssel zu verwenden. Nehmen wir an, ich brauche eine Funktion, die jedes Mal eine eindeutige Zahl zwischen 1 und n Zahlen erzeugt. Und irgendwie muss ich Ausgabe wie JamesHarley125 produzieren. –

+0

Wie ist es möglich, dass Sie mit dem Primärschlüssel irgendeine Art von Duplikat erhalten? Erkläre das bitte. – Petaflop

Antwort

2

Try this,

Select p.FirstName+P.LastName +CAST(ROW_NUMBER() OVER (ORDER BY p.FirstName) AS VARCHAR(20)) 
    from person As P 
+0

Danke Thangadurai –

+1

Anstelle von 'ORDER BY p.FirstName' würde ich' ORDER BY FirstName, Nachname, PersonId' verwenden, sonst haben Sie willkürliche Nummern auf den Duplikaten –

0

Sie können eine Spalte mit inkrementellen ganzen Zahlen schaffen Identität Eigenschaft verwenden und Sie können gleich mit dem Vornamen und Nachnamen verketten. So dass jede Zeile einzigartig ist.

Select p.FirstName + P.LastName + P.Id von Person als P

Hier Spalte P.Id kann erklärt, wie unten in der Tabellendefinition. Dies beginnt mit dem Wert "1" und wird in der Skala von "1" erhöht. Identität (Saatgut, Zuwachs)

id int IDENTITY (1,1)

1

Wenn Sie eine eindeutige Spalte gegen jeden Datensatz zu erhalten, ohne Primärschlüssel Spalte, ich glaube, Sie Zeilennummer Funktion verwenden können. Abfrage unten sollte

Select p.FirstName+P.LastName + CAST((row_number() OVER (PARTITION BY p.FirstName ORDER BY p.FirstName)) AS varchar(100)) from person As P 
0

Aufbauend auf die bisherigen Antworten in diesem Fall arbeiten, erzeugt diese Benutzernamen ohne die Zahlen wo möglich, und fügt dann nur Zahlen die Benutzernamen eindeutig zu machen, wo tatsächlich erforderlich ist. Ich weiß, das ist nicht die genaue Art, wie Sie Ihre Benutzernamen generieren, aber so habe ich mich entschieden, meins zu generieren. Ich habe nur die Tabellennamen geändert, damit sie deinen entsprechen.

with Usernames(PersonId, Username) as 
(
    select PersonId, 
      left(Firstname, 1) + Middlename + Lastname as Username 
     from Person 
), 
NumberedUserNames(PersonId, Username, Number) as 
(
    select PersonId, 
      Username, 
      ROW_NUMBER() OVER (PARTITION BY Username ORDER BY Username) as Number 
     from Usernames 
), 
UniqueUsernames(PersonId, UniqueUsername) AS 
(
    select PersonId, 
      case when Number = 1 then UserName 
           else UserName + CAST(Number-1 as VarChar(20)) 
      End as UniqueUsername 
     from NumberedUserNames 
) 
select PersonId, 
     UniqueUsername 
    from UniqueUsernames; 
Verwandte Themen