none
Zeilenumbruch im SQL Code erzwingen

    Frage

  • 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.

    Donnerstag, 12. Dezember 2013 20:08

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
    Donnerstag, 12. Dezember 2013 21:07
    Beantworter

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

    Donnerstag, 12. Dezember 2013 20:27
    Beantworter
  • 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?


    Donnerstag, 12. Dezember 2013 20:54
  • 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
    Donnerstag, 12. Dezember 2013 21:07
    Beantworter
  • Hallo Elmar,

    dann muss ich die ersten (Ansichts)Spalten bei der Ausgabe wohl temporär deaktivieren.

    Im Textmodus kann ich ja nun leider keine Spaltenergebnisse markieren :-(  

    Schade, das es nicht anders geht.

    Danke für die Antworten.

    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

    Donnerstag, 12. Dezember 2013 21:37
    Beantworter
  • 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.

    Freitag, 13. Dezember 2013 17:15
  • Hallo Elmar,

    ich ergänze mich mal noch, damit es verständlicher wird, was ich so treibe.

    Hier:

    http://social.msdn.microsoft.com/Forums/de-DE/082ba6ae-94fa-4ede-a039-f8ee770d319e/drop-aller-check-constraints-einer-tabelle?forum=sqlserverde

    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.

    Freitag, 13. Dezember 2013 18:37
  • 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

    Samstag, 14. Dezember 2013 08:25
    Beantworter