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 заранее.
Ответы
Ответ 1
Я могу воспроизвести это поведение, если я запустил sp_helptext
с Results to grid
, а затем скопировал и вставил результаты из сетки в новый запрос или любой другой текстовый редактор.
Это похоже на изменение поведения sp_helptext
из предыдущих выпусков, поскольку этот эффект не отображается со стандартными наборами результатов сетки.
Простейшим решением будет запуск sp_helptext
с помощью Results to text
set (Query
→ Results 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
вы заметите, что все лишние пробелы удалены.
Примечание: это работает только для простых запросов, а не для процедур и т.д.