2016-06-02 4 views
0

Ich modifiziere eine C# -App, um durch eine Reihe von SQL-Dateien zu durchlaufen und einen Ansichtsnamen mit dem entsprechenden Tabellennamen zu ersetzen.Auf der Suche nach einer bestimmten Lösung für C# Regex-Muster SQL-Tabelle

Zum Beispiel sollte eine Ansicht namens "Item" durch eine Tabelle namens "Item_mst" ersetzt werden.

Ich habe eine Zuordnungsdatei, die die App an, welche Tabellen zu ersetzen und sieht wie folgt aus, um zu bestimmen sucht:

VIEWNAME1,TABLENAME1_MST 
VIEWNAME2,TABLENAME2_MST 

Das Problem ist, es gibt eine Menge von Szenarien zu suchen, ich habe sie beschrieben unten mit einer Beispiel-SQL-Datei.

Select 
    i.item <<Matches the Item table but is actually the name of the column, no replace 
    ,dbo.item.u_m <<Matches the Item table with DBO., replace 
    ,lot <<Matches the lot table but is actually the name of a column, no replace 
    ,(Select top 1 cost from itemcost) as Cost <<itemcost is a table, replace 
    ,(Select top 1 cost2 from dbo.itemcost) as Cost2 <<matches the itemcost table with dbo., replace 
From 
    dbo.item i <<matches the item table with dbo.,replace 
    cross join itemlot <<matches the itemlot table, replace 

Wie Sie sehen können, gibt es viele verschiedene Szenarien, und ich bin eine harte Zeit, einen regulären Ausdruck zu schreiben/Suchen und Ersetzen-Algorithmus jedes Szenario zuverlässig zu fangen.

Ich bin dbo.tablename und ersetzen diese einfach genug, es ist die verbleibenden Szenarien, mit denen ich Probleme habe. Gibt es irgendwelche REGEX-Experten, die Ideen haben?

ist hier ein Code-Schnipsel:

//Replace all matched views with table names 
for (int j = 0; j < viewCount.Count(); j++) 
{ 
    //replace for "." 
    curFileText = curFileText.Replace(".", "XXXPERIODXXX"); 
    curFileText = Regex.Replace(curFileText, "dboXXXPERIODXXX" + ViewTables[0, j] + "XXXPERIODXXX", "dboXXXPERIODXXX" + ViewTables[1, j] + "XXXPERIODXXX", RegexOptions.IgnoreCase); 
    curFileText = curFileText.Replace("XXXPERIODXXX", "."); 

    //replace for "newline" 
    curFileText = curFileText.Replace(System.Environment.NewLine, "XXXNEWLINEXXX"); 
    curFileText = Regex.Replace(curFileText, ViewTables[0, j] + "XXXNEWLINEXXX", ViewTables[1, j] + "XXXNEWLINEXXX", RegexOptions.IgnoreCase); 
    curFileText = curFileText.Replace("XXXNEWLINEXXX", System.Environment.NewLine); 

    //Fix .column_mst spots 
    curFileText = curFileText.Replace("dbo.", "XXXDBODOTXXX"); 
    curFileText = curFileText.Replace(".", "XXXDOTXXX"); 
    curFileText = Regex.Replace(curFileText, "XXXDOTXXX" + ViewTables[1, j], "XXXDOTXXX" + ViewTables[0, j], RegexOptions.IgnoreCase); 
    curFileText = curFileText.Replace("XXXDOTXXX", "."); 
    curFileText = curFileText.Replace("XXXDBODOTXXX", "dbo."); 

    //replace for " " 
    curFileText = curFileText.Replace(" ", "XXXSPACEXXX"); 
    curFileText = Regex.Replace(curFileText, "dbo." + ViewTables[0, j] + "XXXSPACEXXX", "dbo." + ViewTables[1, j] + "XXXSPACEXXX", RegexOptions.IgnoreCase); 
    curFileText = curFileText.Replace("XXXSPACEXXX", " "); 
} 
+0

Die Beschreibung dessen, was Sie tun möchten, und sein Beispiel sind sehr komplex. Bitte zeigen Sie ein Beispiel für die Eingabe und die gewünschte Ausgabe, damit wir sehen können ** genau ** was Sie wollen. Dann können wir vielleicht die Erklärung interpretieren. Bitte zeigen Sie auch, was Sie bisher versucht haben und erklären Sie, warum es nicht tut, was Sie wollen. Was ist schließlich der Zweck dieses "Code-Snippets"? Wie verhält es sich mit dem Problem? – AdrianHHH

Antwort

0

Warum das Problem nach hinten nicht angehen? Abhängig von Ihrem RDBMS können Sie eine Abfrage wie select table_name, view_definition from information_schema.views verwenden, um eine Liste aller Ansichtsnamen und zugrunde liegenden SQL zu erhalten. Irgendwo in diesem SQL für jede Ansicht wird eine select ... from <table name>-Anweisung für die Ansichten sein, die nur auf einer einzelnen Tabelle basieren. Kopieren Sie diese Ergebnisse in Sublime oder Notepad ++ und verwenden einfache regex (ersetzen ([\w\W]+)(\s+from\s+)(\S+)([\w\W]+) mit $3) eine Liste von Ansichtsnamen mit ihren zugrunde liegenden Tabellen wie dies im Zusammenhang ableiten:
vSomeView SomeTable vOtherView OtherTable

Sobald Sie, dass, benutzen Sie wieder reguläre Ausdrücke zu erzeugen a .Replace Kette zu ersetzen ^([^ ])()(\w\W)$ mit .Replace("$1", "$3"). Kopieren Sie die .Replace Kette in den C# -Code, den Sie für diese Migration verwenden.

Verwandte Themen