2012-06-16 17 views
17

Ich benutze SQL Server 2012, & immer SP_HELPTEXT verwenden, um meine zuvor erstellten Stored Procedures zu erhalten, In früheren Versionen von SQL Server gab es keine Probleme in diesem Prozess, aber im Jahr 2012 kommen meine Stored Procedures mit zusätzlichen Linien, zum Beispiel ist dies das Verfahren, das ichSQL Server 2012 SP_HELPTEXT zusätzliche Zeilen Problem

Create proc SP_Test 
as 
begin 
Select * 
from table_ABC 
end 

nun mit diesem Verfahren nach der Verwendung von SP_HELPTEXT schrieb (oder ein anderes Verfahren), erhalte ich diese Ausgabe

Create proc SP_Test 

as 

begin 

Select * 

from table_ABC 

end 

Ist jemand anderes auch mit diesem Problem konfrontiert oder bin ich der Einzige auf diesem Planeten, der mit diesem Problem kämpft? Kann jemand dieses Problem lösen?

Konfiguration meines SQL Server ist als (von Hilfe kopiert -> Über) folgt

Microsoft SQL Server Management Studio   11.0.2100.60 
Microsoft Analysis Services Client Tools  11.0.2100.60 
Microsoft Data Access Components (MDAC)   6.1.7601.17514 
Microsoft MSXML      3.0 6.0 
Microsoft Internet Explorer    9.0.8112.16421 
Microsoft .NET Framework    4.0.30319.269 
Operating System     6.1.7601 

Thanx im Voraus.

+0

nicht dieses Verhalten sehen Sie hier (SQL Server Express 2012). –

+0

Ich habe jetzt die Konfiguration meiner Version erwähnt, bitte sehen Sie sich das an – yogi

+0

Sie wissen das wahrscheinlich, aber Sie können mit der rechten Maustaste auf eine gespeicherte Prozedur klicken und 'Ändern' gibt Ihnen die Quelle. Mit RedGates kostenloser [SQL-Suche] (http://www.red-gate.com/products/sql-development/sql-search/) können Sie schnell eine gespeicherte Prozedur auswählen. – Andomar

Antwort

17

Ich kann dieses Verhalten replizieren, wenn ich sp_helptext mit Results to grid Satz ausführen, dann kopieren und fügen Sie die Ergebnisse aus dem Raster in eine neue Abfrage oder einen anderen Texteditor.

Dies scheint eine Änderung im Verhalten von sp_helptext aus früheren Ausgaben zu sein, da dieser Effekt nicht mit Standard-Grid-Ergebnismengen angezeigt wird.

Die einfachste Behelfslösung wird sp_helptext mit Results to text Satz laufen (Query. ->Results to>Results to text, Abkürzung CTRL + T

Sie müssen möglicherweise in Results to text die maximale Anzahl von Zeichen pro Zeile erhöhen zu bekommen die Ausgabe, die Sie erwarten - Tools>Options>Query Results>Results to text - set „maximale Anzahl von Zeichen in jeder Spalte angezeigt“ auf den Maximalwert von 8192

+2

Yeah Ergebnis zu Text funktioniert gut, danke :) – yogi

5

Eine bessere wor karound (im Vergleich Ergebnisse zu Text verwenden) meiner Meinung nach ist eine sp_helptext2 storedproc zu erstellen, wie hier erklärt:

http://sql-javier-villegas.blogspot.com/2012/08/a-workaround-for-sphelptext-bug-in-ssms.html

Hinweis: Diese Lösung hat einen Fehler in die letzte Zeile zu verlassen, wenn es keine neue Linie ist das Ende. Berichtigt T-SQL:

CREATE PROCEDURE [dbo].[sp_helptext2] (@ProcName NVARCHAR(256)) 
AS 
BEGIN 
    DECLARE @PROC_TABLE TABLE (X1 NVARCHAR(MAX)) 

    DECLARE @Proc NVARCHAR(MAX) 
    DECLARE @Procedure NVARCHAR(MAX) 
    DECLARE @ProcLines TABLE (PLID INT IDENTITY(1,1), Line NVARCHAR(MAX)) 

    SELECT @Procedure = 'SELECT DEFINITION FROM '+db_name()+'.SYS.SQL_MODULES WHERE OBJECT_ID = OBJECT_ID('''[email protected]+''')' 

    insert into @PROC_TABLE (X1) 
     exec (@Procedure) 

    SELECT @Proc=X1 from @PROC_TABLE 

    WHILE CHARINDEX(CHAR(13)+CHAR(10),@Proc) > 0 
    BEGIN 
     INSERT @ProcLines 
     SELECT LEFT(@Proc,CHARINDEX(CHAR(13)+CHAR(10),@Proc)-1) 
     SELECT @Proc = SUBSTRING(@Proc,CHARINDEX(CHAR(13)+CHAR(10),@Proc)+2,LEN(@Proc)) 
    END 
    --* inserts last line 
    insert @ProcLines 
    select @Proc ; 

    SELECT Line FROM @ProcLines ORDER BY PLID 
END 
+0

Sorry @rufo ..Ihre Antwort funktioniert nicht – Rama

+0

@Dram: sorry - es funktionierte für mich seit Jahren. Ich habe gerade gestoppt, weil es nicht notwendig ist, wenn Sie SSMS 2014 haben. – rufo

0

schrieb ich eine andere Abhilfe, die nur die CrLf ersetzt:

DECLARE @results table ([Text] nvarchar(255)) 

INSERT @results 
Exec sp_helptext spStudyRoleCacheFlushNotificationGet 

SELECT REPLACE(REPLACE([Text], CHAR(10), ''), CHAR(13), '') 
FROM @results 
5

Die Antwort gepostet von Rufo produziert noch leere Zeilen. Eine kleine Änderung in der letzten Codezeile löste das Problem für mich. Hier ist der bearbeitete Code:

CREATE PROCEDURE [dbo].[sp_helptext2] (@ProcName NVARCHAR(256)) 
AS 
BEGIN 
    DECLARE @PROC_TABLE TABLE (X1 NVARCHAR(MAX)) 

    DECLARE @Proc NVARCHAR(MAX) 
    DECLARE @Procedure NVARCHAR(MAX) 
    DECLARE @ProcLines TABLE (PLID INT IDENTITY(1,1), Line NVARCHAR(MAX)) 

    SELECT @Procedure = 'SELECT DEFINITION FROM '+db_name()+'.SYS.SQL_MODULES WHERE OBJECT_ID = OBJECT_ID('''[email protected]+''')' 

    insert into @PROC_TABLE (X1) 
     exec (@Procedure) 

    SELECT @Proc=X1 from @PROC_TABLE 

    WHILE CHARINDEX(CHAR(13)+CHAR(10),@Proc) > 0 
    BEGIN 
     INSERT @ProcLines 
     SELECT LEFT(@Proc,CHARINDEX(CHAR(13)+CHAR(10),@Proc)-1) 
     SELECT @Proc = SUBSTRING(@Proc,CHARINDEX(CHAR(13)+CHAR(10),@Proc)+2,LEN(@Proc)) 
    END 
--* inserts last line 
insert @ProcLines 
select @Proc ; 

--edited here. (where Line<>'') 
SELECT Line FROM @ProcLines where Line<>'' ORDER BY PLID 
END 

Auch wenn dies die „ursprünglichen Zeilenumbrüche“ entfernt, aber das ist viel besser zu leben. Ich migrierte DB von SQL 2008 zu SQL 2012 und alle gespeicherten Prozeduren (mehr als 200) wurden mit etwa 5 Zeilenumbrüchen nach jeder Codezeile zurückgegeben, wenn sp_helptext verwendet.

Der obige Code half mir, es zu lösen.

+0

Dank @Ish Goel für den Code. Es hat mir geholfen – Ram

0

Ich auch dieses Problem für eine Ansicht konfrontiert.

Im Folgenden sind die Schritte i das Problem zu beheben verwendet (beachten Sie nur eine temporäre Lösung)

1) wählen Sie die Abfrage

2) dann einen Rechtsklick und offen in Abfrage-Designer

3) klicken ok

Sie würden feststellen, dass alle zusätzlichen Leerzeichen entfernt werden.

Hinweis: Dies funktioniert nur für einfache Abfragen nicht für Verfahren, etc