2012-03-29 11 views
5

Ich muss Daten aus einer Tabelle in Insert-Anweisungen in SQL konvertieren. Ich habe die meisten regulären Ausdrücke ausgearbeitet, um das Tool zum Suchen und Ersetzen in SSMS zu verwenden, aber ich habe ein Problem, wenn ich versuche, auf das 9. geklammerte Element in meiner endgültigen Ersetzung zu verweisen. HierSQL Find-and-Replace-Regular-Expression-Capture-Gruppenlimit?

ist der ursprüngliche Datensatz:

Blue Doe 12/21/1967 1126 Queens Highway Torrance CA 90802 N 1/1/2012 

Und das ist, was ich brauche (bis jetzt):

select 'Blue','Doe','19671221','1126 Queens Highway','Torrance','CA','90802','N','20120101' 

Aufgrund der Beschränkungen für die Anzahl der eingeklammerten Elemente erlaubt Ich muss durchlaufen das Ersetzen dreimal. Dies funktioniert möglicherweise in einer gespeicherten Prozedur, wenn ich machen kann, dass dies zuerst als ein POC funktioniert.

Dies ist der erste passende Ausdruck:

^{:w:b:w:b}{:z}/{:z}/{:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}{:z}/{:z}/{:z} 

Und die ersetzen: \10\2/0\3/\40\5/0\6/\7

Dies fügt Nullen auf die Monate und Tage, so dass sie mindestens zwei Zeichen lang sein.

Die nächste Übereinstimmung formatiert die Datumsangaben in das für die Abfrage erforderliche Format um (keine Kommentare über die Verwendung eines Datumsfelds. Dies ist eine Clientanforderung für die Datenbank).

Passende Ausdruck:

^{:w:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}{:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z} 

Und die ersetzen: \1\4\(2,2)\(2,3)\5\8\(2,6)\(2,7)

schließlich das Finale fügt die Ergebnisse in die SQL-Anweisung, die in einer INSERT-Anweisung verwendet wird, wird erhalten.

Passende Ausdruck:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b{:z} 

Und die ersetzen: select '\1','\2','\3','\4','\5','\6','\7','\8','\9'

alles funktioniert mit Ausnahme der letzten Ersatz. Aus irgendeinem Grund erhält das \ 9 NICHT die Daten aus dem Spiel. Wenn ich nur den ganzen Replace-Ausdruck durch \ 9 ersetze, bekomme ich eine Leerstelle. Wenn ich \ 8 benutze, bekomme ich N. Wenn ich den 8. geklammerten Artikel eliminiere, was meinen 9. Artikel achtelt, gibt er zurück, was ich will, 20120101.

Also meine Frage ist, erlaubt SSMS/SQL 9 getaggt Ausdrücke bei der Verwendung von Suchen/Ersetzen und regulären Ausdrücken? Oder verpasse ich hier etwas? Ich weiß, dass es andere Möglichkeiten gibt, dies zu tun. Ich versuche nur, es schnell als POC zu erledigen, bevor wir es in einen Sproc oder eine Anwendung verschieben.

Vielen Dank für Ihre Hilfe. -Peter

+0

Sie können direkt aus einer Tabelle importieren. Sind die Daten bereits in separaten Spalten? – RedFilter

+0

Warum brauchen Sie ersetzen? Wenn die Daten aus einem Tabellenblatt stammen und Sie SSMS verwenden, verwenden Sie den Import/Export-Manager. Warum formatieren Sie die Daten nicht auch, wenn das Tabellenkalkulationsformat keine TT/MM/JJJJ-Datumsformate unterstützt? Konnten Sie nicht einige Zellenformeln schreiben, um eine Zeichenkette zu verketten, die die Daten für Sie einfügt? – Trisped

+0

Bearbeiten Sie Ihre Frage, um die korrekte Formatierung von Codeausdrücken hinzuzufügen. Sie können dies tun, indem sie: mit Backticks Umgebung („'“), die alle auswählen und auf die Schaltfläche' {} ', oder durch einen Code-Block Markierung und Drücken von Strg + K. Sie können eine Vorschau Ihres Beitrags (vor dem Posten) direkt unter der Schaltfläche "Frage absenden" anzeigen, wenn Sie ihn eingeben. Die Vorschau wird in Echtzeit aktualisiert. Es handelt sich also um eine WYSIWYG-Ansicht. Wenn Sie die Formatierung richtig formatieren, wird Ihre Frage leichter zu lesen und zu verstehen. Daher ist es viel wahrscheinlicher, dass Sie eine Antwort erhalten. Vielen Dank. :) –

Antwort

2

Keiner Ihrer passenden Ausdrücke funktioniert mit dem Datensatz, den Sie in meinem MS SQL Server Management Studio 2008r2 zur Verfügung gestellt haben.

Aus Ihrer Beschreibung klingt es wie ein Problem mit dem Tagged Expression 9, da das gewünschte Ergebnis zurückgegeben wird, wenn Taged Expression 8, aber nicht 9 verwendet wird. Möglicherweise möchten Sie ask Microsoft or report it as a bug.

Eine schnellere Lösung wäre, den Text, den Sie suchen/ersetzen, in SSMS in ein Tabellenblatt zu verschieben und Zellformeln zu verwenden, um die Daten in Einfügebefehle zu analysieren. Wenn Sie MS Excel haben, werden die Funktionen CONCATENATE, FIND und MID wahrscheinlich nützlich sein. Außerdem hilft es, die Werte in ihre eigenen Spalten aufzuteilen, so dass Sie das Datum formatieren können, und dann eine Verkettung verwenden, um Ihre Einfügung zu erstellen.

Bitte lassen Sie mich wissen, wenn Sie ein Beispiel benötigen.

Update: Ich habe versucht, Ihr Beispiel in MS SQL Server Management Studio 2008r2, Visual Studio 2005 und Visual Studio 2010 mit dem gleichen Ergebnis erhalten, \ 9 gibt eine leere Zeichenfolge zurück. Bei der Überprüfung habe ich festgestellt, dass others are also having this issue (siehe die Community-Inhalt von Henrique Evaristo) und dass das gesamte System wurde replaced in the new editors.

Also als Antwort auf Ihre Frage, unterstützt SSMS 9 gekennzeichnete Ausdrücke aufgrund eines Fehlers nicht.

Wenn Sie nicht auf die Tabellenkalkulations-Idee verwenden Sie die Aktion in zwei Teile aufgeteilt, die Einstellung der ersten 8 Werte könnten versuchen, dann wieder zurück schwingen die letzte zu tun. Beispiel:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b:z 
select '\1','\2','\3','\4','\5','\6','\7','\8','\0' 

:w:b:w:b:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b{:z} 
\1 
+0

Danke für Ihre Antwort. Ich denke, der Grund, warum sie nicht für dich arbeiten, ist ein Problem mit der Art, wie sie in SO eingefügt wurden. Ich habe den ursprünglichen Text aktualisiert, um den "singulären Raum" zwischen jedem Element widerzuspiegeln, das beim Einfügen von SQL nach SO als mehrfach angezeigt wurde. –

+0

@Peter Anderson mit Ergebnissen aktualisiert. Ich würde zu Excel wechseln oder Ihre eigene Lösung kodieren, aber ich habe eine für den Fall geliefert, dass Sie es wünschen. Vielleicht möchten Sie dem '\ 0' ein Sonderzeichen voranstellen, da Sie nicht mehr nach Zeilen suchen können. Oder Sie können die zweite Abfrage ändern, um das '\ 0' in der Auswahl zu finden und von dort aus zu arbeiten. – Trisped

+0

Danke für Ihre Antwort zu diesem Thema. Das habe ich gebraucht. Und danke für die zusätzliche Option am Ende. Ich bin schon dieses Ding dreimal Aufteilung der verschiedenen ersetzt zu handhaben, hatte ich nicht gedacht, nur die \ 0 verwendet und auf einem Viertel ersetzen das letzte Stück nehmen. Danke noch einmal. –