web-dev-qa-db-fra.com

Problème de lignes supplémentaires avec SQL Server 2012 SP_HELPTEXT

J'utilise SQL Server 2012 et j'utilise toujours SP_HELPTEXT pour obtenir mes procédures stockées créées précédemment. Dans les versions précédentes de SQL Server, ce processus ne posait aucun problème, mais en 2012, mes procédures stockées sont accompagnées de lignes supplémentaires, par exemple la procédure suivante. que j'ai écrit

Create proc SP_Test
as
begin
 Select * 
 from table_ABC
end

Maintenant, après avoir utilisé SP_HELPTEXT avec cette procédure (ou toute autre procédure), je reçois cette sortie

Create proc SP_Test

as

begin

 Select * 

 from table_ABC

end

Est-ce que quelqu'un d'autre est également confronté à ce problème ou je suis le seul sur cette planète à lutter contre ce problème? Est-ce qu'un organisme sait comment résoudre ce problème?

La configuration de mon serveur SQL est la suivante (copié depuis Aide -> À propos de )

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

Merci d'avance.

18
yogi

Je peux répliquer ce comportement si j'exécute sp_helptext avec Results to grid set, puis copiez et collez les résultats de la grille dans une nouvelle requête ou un autre éditeur de texte.

Cela semble être un changement dans le comportement de sp_helptext par rapport aux éditions précédentes, car cet effet n'est pas affiché avec les ensembles de résultats de grille standard.

La solution la plus simple consiste à exécuter sp_helptext avec Results to text set (Query -> Results to> Results to text, raccourci CTRL + T.

Vous devrez peut-être augmenter le nombre maximal de caractères par ligne dans Results to text pour obtenir le résultat attendu - Tools> Options> Query Results> Results to text - définissez le "nombre maximal de caractères affichés dans chaque colonne" à la valeur maximale de 8192.

20
Ed Harper

Une meilleure solution de contournement (comparée à l'utilisation de Results au texte) est, à mon avis, de créer un sp_helptext2 storageproc comme expliqué ici: 

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

Remarque: cette solution a un bogue qui supprime la dernière ligne s'il n'y a pas de nouvelle ligne à la fin. T-SQL corrigé: 

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('''+@ProcName+''')'

  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
5
rufo

La réponse publiée par Rufo produit toujours des lignes vides. Un petit changement dans la dernière ligne de code a résolu le problème pour moi. Voici le code édité:

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('''+@ProcName+''')'

  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

Même si cela supprime les "retours de chariot d'origine", il est toutefois préférable de vivre avec. J'ai migré par DB de SQL 2008 vers SQL 2012 et toutes les procédures stockées (plus de 200) ont été renvoyées avec environ 5 retours chariot après chaque ligne de code lors de l'utilisation de sp_helptext.

Le code ci-dessus m'a aidé à le résoudre.

5
Ish Goel

J'ai écrit une autre solution de contournement qui remplace simplement le CrLf:

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

INSERT @results
Exec sp_helptext spStudyRoleCacheFlushNotificationGet

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

J'utilise la solution de Rufo, mais je viens de me rendre compte qu'elle se casse lorsque la base de données contient un tiret. Exemple: [ST-SALES].

Pour ce que ça vaut, c'est une réponse mise à jour basée sur la solution de Rufo.

ALTER 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('''+@ProcName+''')'

  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

Moi aussi j'ai fait face à ce problème pour une vue. 

Voici les étapes que j'ai utilisées pour résoudre le problème (notez uniquement un correctif temporaire)

1) sélectionnez la requête 

2) puis faites un clic droit et ouvrez le concepteur de requêtes

3) cliquez sur ok 

vous remarquerez que tous les espaces supplémentaires sont supprimés.

Remarque: cela ne fonctionne que pour les requêtes simples, pas pour les procédures, etc.

0
Ram