Schnellste Weg, um entfernen nicht-numerische Zeichen von VARCHAR in SQL Server
Schreibe ich eine import-Dienstprogramm, das verwenden von Telefonnummern, wie Sie einen eindeutigen Schlüssel innerhalb der import.
Ich brauche, um zu überprüfen, dass die Telefonnummer nicht bereits in meiner DB. Das problem ist, dass die Telefonnummern in der DB hätten die Dinge wie Bindestriche und Klammern, und möglicherweise auch andere Dinge. Ich schrieb eine Funktion zum entfernen dieser Dinge, das problem ist, dass es langsam und mit tausenden von Datensätze in meiner DB und Tausende von Datensätzen zu importieren, auf einmal, kann dieser Prozess sehr langsam. Hab ich schon gemacht und der Telefonnummer-Spalte ein index ist.
Ich habe versucht mit dem script aus diesem post:
T-SQL-trim   (und andere nicht-alphanumerische Zeichen)
Aber das hat nicht beschleunigen alle.
Ist es ein schneller Weg, um zu entfernen nicht-numerische Zeichen? Etwas, das gut performen kann, wenn 10.000 bis 100.000 Datensätze verglichen werden müssen.
Was auch immer getan durchführen muss schnell.
Update
Angesichts dessen, was Menschen reagierten darauf mit, ich glaube, ich bin zu haben, reinigen Sie die Felder aus, bevor ich das import-Dienstprogramm.
Antwort auf die Frage, was Schreibe ich das import-Dienstprogramm, es ist eine C# - app. Ich Vergleiche BIGINT, BIGINT jetzt, keine Notwendigkeit zu ändern, DB-Daten und ich bin immer noch unter einen performance-hit mit einer sehr kleinen Menge von Daten (über 2000 Datensätze).
Konnte Vergleich von BIGINT bis BIGINT werden verlangsamt Dinge nach unten?
Habe ich optimiert den code der Seite meiner app so viel wie ich kann (entfernt regexes, entfernt unnötige DB-Aufrufe). Zwar kann ich nicht isolieren SQL als Quelle der problem mehr, ich fühle mich immer noch wie es ist.
InformationsquelleAutor Dan Herbert | 2008-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich kann es missverstehen, aber du hast zwei Sätze von Daten, um entfernen Sie die Saiten von einem für die aktuellen Daten in der Datenbank und dann einen neuen Satz, wenn Sie importieren.
Zur Aktualisierung der bestehenden Datensätze, ich möchte nur SQL verwenden, die nur einmal geschehen.
Aber SQL ist nicht optimiert für diese Art der operation, da Sie sagten, Sie schreiben eine import-Dienstprogramm, die ich tun würde, diese updates im Rahmen der import-Dienstprogramm selbst, nicht in SQL. Dies wäre viel besser Leistung klug. Was schreiben Sie das Programm in?
Auch, ich kann ganz Missverständnis des Prozesses, so dass ich entschuldige mich, wenn off-base.
Edit:
Für das erste update, wenn Sie SQL Server 2005 verwenden, könnten Sie versuchen, eine CLR-Funktion. Hier ist auf die schnelle mit regex. Nicht sicher, wie Sie die Leistung vergleichen, habe ich diesen noch nie benutzt habe mich außer für einen schnellen test jetzt.
Nachdem diese bereitgestellt wird, zu aktualisieren, Sie könnten einfach verwenden:
InformationsquelleAutor Scott Nichols
Sah ich diese Lösung mit T-SQL-code und PATINDEX. Ich mag es 🙂
InformationsquelleAutor David Coster
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(string,'a',''),'b',''),'c',''),'d',''),'e',''),'f',''),'g',''),'h',''),'i',''),'j',''),'k',''),'l',''),'m',''),'n',''),'o',''),'p',''),'q',''),'r',''),'s',''),'t',''),'u',''),'v',''),'w',''),'x',''),'y',''),'z',''),'A',''),'B',''),'C',''),'D',''),'E',''),'F',''),'G',''),'H',''),'I',''),'J',''),'K',''),'L',''),'M',''),'N',''),'O',''),'P',''),'Q',''),'R',''),'S',''),'T',''),'U',''),'V',''),'W',''),'X',''),'Y',''),'Z','')*1 AS string
,🙂
* CAST(1 AS bigint)
InformationsquelleAutor Brainwater
Fall, dass Sie nicht wollen, um eine Funktion zu erstellen, oder Sie brauchte nur einen einzigen inline-call-in T-SQL, die Sie könnten versuchen:
Natürlich ist das spezifisch für das entfernen von Telefonnummer formatieren, nicht eine generische entfernen Sie alle Sonderzeichen aus dem string-Funktion.
InformationsquelleAutor Tom
Einfache Funktion:
InformationsquelleAutor AdamE
InformationsquelleAutor Debayan Samaddar
können Sie entfernen Sie Sie in einem nächtlichen Prozess, der Speicherung in einem eigenen Feld, dann tun Sie ein update auf die geänderten Datensätze nach rechts, bevor Sie den Vorgang ausführen?
Oder auf einfügen/aktualisieren, speichern Sie die "numeric" - format, Referenz später. Ein Auslöser wäre eine einfache Möglichkeit, es zu tun.
InformationsquelleAutor Dan Williams
Ich würde versuchen, Scott CLR-Funktion den ersten, aber eine WHERE-Klausel hinzufügen, reduzieren Sie die Anzahl der Datensätze, die aktualisiert werden.
Wenn Sie wissen, dass die große Mehrheit der Datensätze mit nicht-numerischer Zeichen, es kann nicht helfen, aber.
InformationsquelleAutor Mike L
Ich weiß, es ist spät, um das Spiel, aber hier ist eine Funktion, die ich erstellt für T-SQL, entfernt schnell nicht-numerische Zeichen. Der Hinweis, ich habe ein schema "String" , ich legte utility-Funktionen für strings in...
Dann zu vergleichen, die für das einfügen, so etwas wie dieses;
InformationsquelleAutor Dennis Allen
Arbeiten mit varchars ist grundsätzlich langsam und ineffizient im Vergleich zu der Arbeit mit Numerik, aus offensichtlichen Gründen. Die Funktionen, die Sie ein link in der original-Beitrag ist in der Tat ziemlich langsam, wie Sie eine Schleife durch jedes Zeichen in der Zeichenfolge, um zu bestimmen, ob oder nicht es ist eine Zahl. Tun, dass für Tausende von Datensätzen und den Prozess gebunden ist, langsam zu sein. Dies ist der perfekte job für Reguläre Ausdrücke, aber Sie sind nicht nativ in SQL Server unterstützt. Können Sie Unterstützung hinzufügen, verwenden Sie eine CLR-Funktion, aber es ist schwer zu sagen, wie langsam das sein wird, ohne zu versuchen, Sie ich würde auf jeden Fall erwarten, dass es deutlich schneller als die Schleife durch jedes Zeichen von jedem Telefon-Nummer, aber!
Sobald man das Telefon formatierte zahlen in Ihrer Datenbank, so dass Sie nur zahlen, Sie wechseln konnte, in einen numerischen Datentyp in SQL würde die Ausbeute Blitz-schnell Vergleiche mit anderen numerischen Typen. Sie werden feststellen, dass, je nachdem, wie schnell Ihr neue Daten ankommen, tut das trimmen und Umwandlung von numerischen auf der Datenbank-Seite ist reichlich schnell genug, wenn das, was Sie sind im Vergleich zu den richtig formatiert, aber wenn möglich, wäre es besser zu schreiben, ein import-Programm in einem .NET-Sprache, die kümmern sich um diese Probleme mit der Formatierung, bevor Sie auf die Datenbank.
Entweder Weg, obwohl, Sie gehen zu müssen, ein großes problem in Bezug auf optionale Formatierung. Auch wenn Ihre zahlen sind garantiert nur nordamerikanischen Ursprungs, einige Leute setzen die 1 vor einem komplett area-code qualifizierten Telefonnummer und andere nicht, wodurch sich das Potenzial für mehrere Einträge von der gleichen Telefonnummer. Außerdem, je nachdem, was Ihre Daten darstellt, einige Leute werden über Ihre private Telefonnummer, die möglicherweise mehrere Menschen, die dort Leben, also eine unique-Einschränkung auf würde es erlauben nur eine Datenbank-Mitglied pro Haushalt. Einige verwenden würden, Ihre Arbeit, die Anzahl und das gleiche problem haben, und manche würden nicht oder gehören die Erweiterung, die Ursache wäre künstliche Einzigartigkeit Potenzial wieder.
Alle, die möglicherweise oder möglicherweise keine Auswirkungen auf Sie, je nach Ihren spezifischen Daten und Verwendungen, aber es ist wichtig, im Auge zu behalten!
InformationsquelleAutor Grank
"Zwar kann ich nicht isolieren SQL als Quelle der problem mehr, ich fühle mich immer noch wie es ist."
Feuer bis Sie SQL Profiler und schauen. Die resultierende Abfragen und überprüfen die Ausführung von Plänen, um sicherzustellen, dass der index verwendet wird.
InformationsquelleAutor Amy B
Tausende von Datensätzen gegen Tausende von Datensätzen ist normalerweise kein problem. Ich habe SSIS import von Millionen von Datensätzen mit de-duping wie diese.
Ich würde bereinigen der Datenbank zu entfernen, die nicht-numerische Zeichen in der ersten Stelle, und halten Sie Sie heraus.
InformationsquelleAutor Cade Roux
Suchen für eine super-einfache Lösung:
InformationsquelleAutor Tim
Ich würde die Verwendung einer Inline-Funktion aus performance-Sicht, siehe unten:
Beachten Sie, dass Symbole wie '+','-' usw. werden nicht entfernt werden
Können Sie definieren es mit mehr als 100 Zeichen...
InformationsquelleAutor hkravitz
Ich würde empfehlen, die Durchsetzung eines strengen format für Telefonnummern in der Datenbank. Ich benutze das folgende format. (Vorausgesetzt, dass UNS die Telefon-Nummern)
Datenbank: 5555555555x555
Anzeige: (555) 555-5555 ext 555
Input: 10-stellig oder mehr Ziffern, eingebettet in eine beliebige Zeichenfolge. (Regex ersetzen entfernt alle nicht-numerischen Zeichen)
InformationsquelleAutor epochwolf