Benutzer mit den meisten Antworten
Zeilenumbruch im SQL Code erzwingen
-
Guten Abend in die Runde,
ich habe folgende Frage:
Ich führe diese Abfrage aus, und kopiere das Ergebnis aus der Spalte Anweisung in ein neues Abfragefenster:
SELECT GETDATE () AS Datum, 'IF (GETDATE () = GETDATE ()) PRINT ' + '''' + 'Hallo' + '''' AS Anweisung
Ergebnis: ok
Jetzt führe ich diese Abfrage auf, und kopiere wiederum das Ergebnis der Spalte Anweisung in ein neues Abfragefenster:
SELECT GETDATE () AS Datum, 'IF (GETDATE () = GETDATE ()) PRINT ' + '''' + 'Hallo' + '''' + nchar(8233) + 'GO' AS Anweisung
Es wird beim 'GO' ein Zeilenumbruch erzeugt. Diese Information zum Zeilenumbruch habe ich http://www.insidesql.org/blogs/yuiwtsch/2010/12/23/zeilenumbruch-t-sql entnommen. Allerdings läuft die Abfrage auf einen Fehler. Lösche ich das Zeichen vor dem 'GO', und füge den Zeilenumbruch mit der Tastatur ein, läuft die Abfrage.
Das deutet darauf hin, das der Steuerbefehl zum Zeilenumbruch nicht richtig übernommen bzw. interpretiert wird. Ich habe es auch schon mit char (13), ... probiert - alles ohne Erfolg.
Kennt jemand eine Lösung?
Hintergrund meiner Anfrage ist übrigens, dass ich aus einer Datenbank über diesen Weg sehr viele Informationen auslese und über einfaches Kopieren weiterverarbeiten möchte.
Vielen Dank schon mal.
Frage
Antworten
-
Hallo Jörg,
wenn Du die Abfrage im SSMS ausführst, verwende bitte den Textmodus (STRG+T) - denn in der Datenansicht werden Zeilenumbrüche "elemeniert".
Dann befindet sich das GO in einer zweiten Zeile (unter dem Datum) und muss mitkopiert werden.
Gruß Elmar
- Als Antwort markiert Joerg_x Donnerstag, 12. Dezember 2013 21:19
Alle Antworten
-
Hallo Jörg,
die Kommandozeilen-Tools verstehen nur "konventionelle" Zeilenumbrüche und die bestehen in Windows aus CR + LF - (N)CHAR(13) + (N)CHAR(10) - wie auch im Blog beschrieben:
SELECT GETDATE () AS Datum, 'IF (GETDATE () = GETDATE ()) PRINT ' + '''' + 'Hallo' + '''' + CHAR(13) + CHAR(10) +'GO' AS Anweisung
Und bitte nicht irritiert sein, dass das GO im Textmodus vorne steht, das ist in der Anzeige zwangsweise so. Wenn Du es zusammen mit dem Rest kopierst - oder in eine Datei schreibst - so funktioniert es - im Gegensatz zu weiteren in Unicode definierten Satzzeichen.
Gruß Elmar
-
Hallo Elmar,
es geht leider nicht.
Vielleicht habe ich mich nicht genau ausgedrückt, oder Deine Lösung nicht verstanden. Die Abfrage funktioniert
Kopiere ich jetzt aus dem Ergebnis aus der Spalte Anweisung den rot markierten Teil:
und führe das in einem neuen Abfragefenster aus:
IF (GETDATE () = GETDATE ()) PRINT 'Hallo' GO
erhalte ich - weiterhin - einen Fehler:
Meldung 102, Ebene 15, Status 1, Zeile 1
Falsche Syntax in der Nähe von 'GO'.Lösche ich die Zeichen vor 'GO', füge einen Zeilenumbruch mit Tastatur ein, geht es.
Die Spalte Anweisung hat hier nur eine Zeile, im richtigen Leben aber sehr viele Zeilen, die bis zum Ende durchlaufen müssen.
Hast Du noch eine Idee?
-
Hallo Jörg,
wenn Du die Abfrage im SSMS ausführst, verwende bitte den Textmodus (STRG+T) - denn in der Datenansicht werden Zeilenumbrüche "elemeniert".
Dann befindet sich das GO in einer zweiten Zeile (unter dem Datum) und muss mitkopiert werden.
Gruß Elmar
- Als Antwort markiert Joerg_x Donnerstag, 12. Dezember 2013 21:19
-
-
Hallo Jörg,
wenn Du Zusatzinformationen unterbringen willst, gehts als Kommentar:
SELECT '-- Datum: ' + CONVERT(varchar, GETDATE(), 120) + CHAR(13) + CHAR(10) + 'IF (GETDATE () = GETDATE ()) PRINT ' + '''' + 'Hallo' + '''' + CHAR(13) + CHAR(10) + 'GO'
aber übertreiben sollte man es damit nicht.
Gruß Elmar
-
Hallo Elmar,
ich habe nun die ersten Zeilen auskommentiert, so dass nur noch die Spalte verbleibt, die dynamisch erstellten ausführbaren SQL-Code enthält.
Zwar erfolgt im Textmodus jetzt die Zeilenschaltung von 'GO', nur wird die Anweisung irgendwo bei 250 Zeichen einfach abgeschnitten. Bei 10.000 Zeilen ist mir das zuviel zum prüfen.
Ich kopiere die ~10.000 Zeilen nun nach Word, arbeite da mit SUCHEN & ERSETZEN ( ^l GO ) für die korrekte Zeilenschaltung, und übertrage das dann wieder nach SQL.
Die ~10.000 Zeilen laufen nun ohne Syntaxfehler bis zum Ende durch.
Schade, ich hätte es gerne im SQL ohne Zwischenschritt mit Word gelöst.
Viele Grüsse.
-
Hallo Elmar,
ich ergänze mich mal noch, damit es verständlicher wird, was ich so treibe.
Hier:
hast Du mal geantwortet.
Dies ist bei mir ein Teilproblem; und für manuelle Arbeit zu umfangreich.
Ich lese dies deshalb aus:
SELECT ConstraintName = OBJECT_NAME(constraint_object_id), ParentTable = OBJECT_NAME(parent_object_id), ParentColumn = COL_NAME(parent_object_id, parent_column_id), ReferencedTable = OBJECT_NAME(referenced_object_id), ReferencedColumn = COL_NAME(referenced_object_id, referenced_column_id), 'IF EXISTS (SELECT * FROM sys.foreign_keys WHERE referenced_object_id = OBJECT_ID(N' + '''' + '[dbo].[' + OBJECT_NAME(referenced_object_id) +']' + '''' +') AND parent_object_id = OBJECT_ID(N' + '''' + '[dbo].[' + OBJECT_NAME(parent_object_id) +']' + '''' +')) ' + 'ALTER TABLE ' + OBJECT_NAME(parent_object_id) + ' drop constraint ' + OBJECT_NAME(constraint_object_id) + ';' AS SQL_CONSTRAINTS_Loeschen FROM sys.foreign_key_columns
und übertrage den Spalteninhalt SQL_CONSTRAINTS_Loeschen in eine neue Abfrage. Die soll aber bis zum Ende durchlaufen - auch im Fehlerfall. Deshalb war mein Anliegen das Semikolon zu ersetzen mit Zeilenumbruch & GO, und das im obigen Quelltext zu realisieren.
Ich hoffe nun sind alle Unklarheiten beseitigt.
-
Hallo Jörg,
SSMS begrenzt die Spaltenausgabe - siehe Extras -> Optionen -> Abfrageergebnisse. Entsprechendes gilt für Kommandozeilenprogramme wie sqlcmd (dort -w, -y Parameter).
Deswegen schreibe ich solche Dinge in einer Programmierumgebung und gebe sie in eine Datei aus. Ob man dafür .NET, Powershell, VBA nimmt, ist reine Geschmackssache. Mehr machen kann man dort auch, da Zeichen-Operationen nicht gerade eine Stärke von T-SQL sind.
Tipp am Rande: Objektnamen sollte man über QUOTENAME bilden.
Gruß Elmar

