SQL Server 2012 SP_HELPTEXT额外行问题

yog*_*ogi 19 sql sql-server ide formatting

我正在使用SQL Server 2012,并始终使用SP_HELPTEXT以获取我以前创建的存储过程,在以前版本的SQL服务器中,此过程中没有问题,但在2012年,我的存储过程带有额外的行,例如,这是我写

Create proc SP_Test
as
begin
 Select * 
 from table_ABC
end
Run Code Online (Sandbox Code Playgroud)

现在使用SP_HELPTEXT此过程(或任何其他过程)后,我得到此输出

Create proc SP_Test

as

begin

 Select * 

 from table_ABC

end
Run Code Online (Sandbox Code Playgroud)

还有其他人也面临这个问题,或者我是这个星球上唯一一个与这个问题斗争的人?有没有人知道如何解决这个问题?

我的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
Run Code Online (Sandbox Code Playgroud)

Thanx提前.

Ed *_*per 22

如果我sp_helptext使用Results to gridset 运行,我可以复制此行为,然后将结果从网格复制并粘贴到新查询或任何其他文本编辑器中.

这似乎是sp_helptext以前版本行为的变化,因为此效果不会与标准网格结果集一起显示.

最简单的解决方法是sp_helptext使用Results to textset 运行(Query- Results to>> Results to text,快捷键CTRL+ T.

您可能需要增加每行的字符的最大数目Results to text,以获得您所期望的输出- Tools> Options> Query Results> Results to text-设置为8192最大值"中的每一列显示的字符的最大数量".

  • 是的结果文本工作正常,thanx :) (2认同)

ruf*_*ufo 5

在我看来,更好的解决方法(与使用结果文本相比)是创建一个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('''+@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
Run Code Online (Sandbox Code Playgroud)


小智 5

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('''+@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
Run Code Online (Sandbox Code Playgroud)

虽然这消除了"原始回车",但这种方式更适合居住.我将数据库从SQL 2008迁移到SQL 2012,并且在使用sp_helptext时,在每行代码之后返回所有存储过程(超过200个),并返回大约5个回车符.

上面的代码帮我解决了.