2016-08-04 42 views
0

Ich verwende SQL Server 2014 Developer Edition Service Pack 2 auf Windows 7 Enterprise-Computer.SQL Server 2014 Set-basierte Methode zum Erstellen einer eindeutigen Ganzzahl für eine Zeichenfolge Kombination Eingabe

Die Frage

Gibt es eine Reihe basiert Weise, dass ich eine ganze Feld auf einem String-Input basiert schaffen können? Es muss sicherstellen, dass das Feld Entity ID niemals für verschiedene Eingaben dupliziert wird?

Hypothetische Tabellenstruktur

|ID|Entity ID|Entity Code|Field One|From Date|To Date | 
|1 |1  |CodeOne |ValueOne |20160731 |20160801| 
|2 |1  |CodeOne |ValueTwo |20160802 |NULL | 
|3 |2  |CodeTwo |ValueSix |20160630 |NULL | 

die obige Tabelle, ich versuche, einen Weg zu finden, die Entity ID basierend auf dem Entity Code Feld zu erzeugen (es ist möglich, dass wir eine Kombination von Feldern verwenden würden,)

Was bisher habe ich versucht habe

  1. Verwenden eines Sequenzobjekts (nicht erwünscht, weil die Sequenz gelöscht werden und die Zählung zurückgesetzt werden kann)
  2. Erstellen einer Tabelle zum Verfolgen der Entitäten, Erstellen einer neuen Entity ID jedes Mal, wenn eine neue Entität gefunden wird (mag das nicht, weil es keine Set-basierte Operation ist)
  3. Erstellen eines Hashbyte auf dem Entity Code Feld und Konvertieren dieser in ein BIGINT (Ich habe keinen Beweis, dass dies nicht funktioniert, aber es fühlt sich nicht so an eine robuste Lösung)

Vielen Dank im Voraus alle.

+0

Können Sie bitte geben Sie einige Beispiele ... für diese Aussage .. "Gibt es einen satzbasierten Weg, wie ich ein Integer-Feld basierend auf einer String-Eingabe erstellen kann?" – TheGameiswar

+0

Wenn Sie meinen, dass Sie eine Zeichenfolge verwenden und eine eindeutige und _reproductive_ Ganzzahl mit keinem anderen Kontext ableiten möchten, dann Nein. Ein Hash kann mehrere verschiedene Zeichenfolgen auf denselben Wert reduzieren. Sie können das Spiel des Erstellens eines Wertes, z. durch Hashing und dann Inkrementieren, bis Sie einen zuvor unbenutzten Wert finden, der jedoch Kontext erfordert, d. h. alle zuvor zugewiesenen Werte, und nicht mit nur der Zeichenkette als Eingabe reproduziert werden kann. Sonderfälle können z. Wenn Sie wissen, dass die Länge der Zeichenfolge niemals vier Zeichen überschreiten wird, ist der Zeichensatz begrenzt, .... – HABO

+0

Ich glaube, der einzige Weg, dies zu erreichen, ist mit einem 'cursor', der prüft, ob jeder'EntityCode' bereits eingefügt wird und wenn nicht, wird die maximale 'EntityID' inkrementiert, um eine neue' EntityID' zu erzeugen 'Entitätscode'. Das würde offensichtlich sehr langsam ablaufen und überhaupt nicht gesetzt werden. – iamdave

Antwort

0

Ihre Bedenken über HashBytes Kollisionen sind verständlich, aber ich denke, dass Sie Ihre Sorgen beiseite legen können. siehe How many random elements before MD5 produces collisions?

Ich habe diese Technik beim Maskieren Zehntausende von Kundenkontonummern verwendet. Ich habe noch eine Kollision

Select cast(HashBytes('MD5', 'V5H 3K3') as int) 

Returns -381163718

(Anm.: Wie oben dargestellt, können Sie negative Werte sehen wir nichts ausmachte), um Zeuge