2017-02-22 11 views
0

私は自分のシステム内の各ユーザに固有のログインユーザ名を生成しようとしています。TSQLを使用して一意のユーザー名を生成するにはどうすればよいですか?

私がこれまでに行っていることである。ここでは

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

1255は主キーです。出力はJamesHarley1255、 のようですが、私はPrimarykeyを使いたくありません。他の の代替品は何ですか?多数の重複レコードもあります。 1からnまでの数字のたびに固有の番号を生成する関数が必要です。そしてどういうわけか、私はあなたがIDプロパティを使用して、増分の整数で列を作成することができますし、姓と名と同じ連結でき、これを試してみてくださいJamesHarley125

+1

実際の要件は何ですか?あなたのクエリで、または新しい主キーとしてユニークな名前が必要ですか? firstname + lastnameだけを組み合わせると、避けたい複製が得られます。プライマリキーを追加できないのはなぜですか?なぜDISTINCTを使用できないのですか?目標は何ですか? –

+0

プライマリキーを使用せずに一意のユーザー名が必要です。私は1からnまでの数字のたびに一意の数値を生成する関数が必要だと言うことができます。 そして何とか私はJamesHarley125のような出力を生成する必要があります。 –

+0

プライマリキーを使用すると、どのような重複が発生する可能性はありますか?これを説明してください。 – Petaflop

答えて

2

よう

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

ありがとうThangadurai –

+1

'ORDER BY p.FirstName'の代わりに' ORDER BY FirstName、LastName、PersonId'を使用します。そうでない場合は、 –

0

を出力を生成する必要があります。各行が一意になるようにします。

P

として人から選択p.FirstName + P.LastName + P.Id

ここ列P.Idは、テーブル定義で以下のように宣言することができます。これは値 '1'で始まり、 '1'のスケールで増分されます。アイデンティティ(シード、インクリメント)

のid int型のIDENTITY(1,1)

1

あなたは主キー列を使用せずに、各レコードに対して1つの一意の列を取得したい場合は、私はあなたが行番号の機能を使用することができると思います。以下のクエリは、前の回答オフビルこの場合には

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

を動作するはずです、これは数字可能であればせずにユーザ名を生成し、その後、唯一、実際に必要な固有のユーザー名を作るために数字を追加します。私はこれがあなたのユーザー名を生成する正確な方法ではないことを知っていますが、これが私の生成する方法です。私はちょうどあなたの名前に合わせてテーブル名を変更しました。

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; 
関連する問題