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