Вопрос по sql-server, ide, sql, formatting – SQL Server 2012 SP_HELPTEXT проблема с дополнительными строками

18

Я использую SQL Server 2012 & amp; всегда использоватьSP_HELPTEXT чтобы получить мои ранее созданные хранимые процедуры, в предыдущих версиях SQL-сервера не было проблем в этом процессе, но в 2012 году мои хранимые процедуры имели дополнительные строки, например, это процедура, которую я написал

Create proc SP_Test
as
begin
 Select * 
 from table_ABC
end

Теперь после использованияSP_HELPTEXT с помощью этой процедуры (или любой другой процедуры), я получаю этот вывод

Create proc SP_Test

as

begin

 Select * 

 from table_ABC

end

Кто-нибудь еще сталкивается с этой проблемой, или я единственный на этой планете, чтобы бороться с этой проблемой? Кто-нибудь знает, как решить эту проблему?

Конфигурация моего сервера SQL выглядит следующим образом (скопировано сHelp -> About )

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

Спасибо заранее.

Вы, вероятно, знаете это, но вы можете щелкнуть правой кнопкой мыши хранимую процедуру иModify даст вам источник. RedGate бесплатноSQL Search помогает быстро выбрать хранимую процедуру. Andomar
Я уже упоминал конфигурацию моей версии, пожалуйста, посмотрите на нее yogi
Не вижу такого поведения здесь (SQL Server Express 2012). David Brabant

Ваш Ответ

7   ответов
-1

Существует два типа решений, которые вы можете использовать для удаления лишнего пространства из вывода sp_helptext.

Goto Tools>Option>Query Results>Result to text (From drop down list) Copy sp_helptext output Paste in Notepad++. open find and replace window by pressing cntl+H enter the following text to replace with new text as in given picture. enter image description here
Это больше похоже на метод пост-обработки вывода, чем на самом деле изменение формата вывода.
0

Я тоже столкнулся с этой проблемой для просмотра.

Ниже приведены шаги, которые я использовал для решения проблемы (обратите внимание только на временное исправление)

1) выберите запрос

2) затем щелкните правой кнопкой мыши и откройте в конструкторе запросов

3) нажмите ОК

Вы заметите, что все лишние пробелы удалены.

Примечание: это работает только для простых запросов, а не для процедур и т. Д.

,
0

Я написал другой обходной путь, который просто заменяет CrLf:

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

INSERT @results
Exec sp_helptext spStudyRoleCacheFlushNotificationGet

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

Я использовал решение Rufo, но я только что понял, что оно ломается, когда в базе данных есть тире. Пример:[ST-SALES].

Что бы это ни стоило, это обновленный ответ, основанный на решении 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('''[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
20

Я могу повторить это поведение, если я бегуsp_helptext сResults to grid установить, затем скопировать и вставить результаты из сетки в новый запрос или любой другой текстовый редактор.

Это, кажется, изменение в поведенииsp_helptext из предыдущих изданий, поскольку этот эффект не отображается со стандартными наборами результатов сетки.

Самый простой обходной путь будет работатьsp_helptext сResults to text задавать (Query - & GT;Results to & GT;Results to textярлыкCTRL + T.

Возможно, вам придется увеличить максимальное количество символов в строке вResults to text чтобы получить результат, который вы ожидаете -Tools & GT;Options & GT;Query Results & GT;Results to text - установить «максимальное количество символов, отображаемых в каждом столбце»; до максимального значения 8192.

Да, результат к тексту работает нормально, спасибо :) yogi
5

На мой взгляд, лучший обходной путь (по сравнению с использованием Results to text) - создать хранимый процесс sp_helptext2, как описано здесь:

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

Примечание: в этом решении есть ошибка, пропускающая последнюю строку, если в конце нет новой строки. Исправленный 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
@Dram: извините - у меня это работало годами. Я только недавно прекратил использовать, потому что нет необходимости, если у вас SSMS 2014.
Извините, @rufo. Ваш ответ не работает
5

Ответ, опубликованный Руфо, до сих пор приводит к пустым строкам. Небольшое изменение в последней строке кода решило проблему для меня. Вот отредактированный код:

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

Хотя это и удаляет «возврат каретки», но с этим лучше жить. Я перенес DB с SQL 2008 на SQL 2012, и все хранимые процедуры (более 200) были возвращены с 5 возвратами каретки после каждой строки кода при использовании sp_helptext.

Приведенный выше код помог мне решить эту проблему.

Спасибо @Ish Goel за код. Это помогло мне

Похожие вопросы