Подтвердить что ты не робот

SQL-сервер 2012 выпуск дополнительных строк SP_HELPTEXT

Я использую SQL-сервер 2012 и всегда использую SP_HELPTEXT для получения ранее созданных хранимых процедур. В предыдущих версиях SQL-сервера в этом процессе не было никаких проблем, но в 2012 году My Stored Procedures поставляются с дополнительными строками для Например, это процедура, которую я написал

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-сервера выглядит следующим образом (скопировано из Справка → О)

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 заранее.

4b9b3361

Ответ 1

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

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

Простейшим решением будет запуск sp_helptext с помощью Results to text set (QueryResults to > Results to text, ярлык CTRL + T.

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

Ответ 2

Лучшее обходное решение (по сравнению с использованием результатов для текста), на мой взгляд, заключается в создании sp_helptext2 storedproc, как описано здесь:

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

Ответ 3

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

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.

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

Ответ 4

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

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

INSERT @results
Exec sp_helptext spStudyRoleCacheFlushNotificationGet

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

Ответ 5

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

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

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

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

3) нажмите ok

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

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