SQL Server 2012 SP_HELPTEXT额外行问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server 2012 SP_HELPTEXT额外行问题相关的知识,希望对你有一定的参考价值。

我正在使用SQL Server 2012,并始终使用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服务器的配置如下(从帮助 - >关于复制)

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

提前致谢。

答案

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

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

最简单的解决方法是运行sp_helptextResults to text设置(Query - > Results to> Results to text,快捷CTRL + T

您可能需要增加Results to text中每行的最大字符数以获得预期的输出 - Tools> Options> Query Results> Results to text - 将“每列中显示的最大字符数”设置为最大值8192。

另一答案

在我看来,更好的解决方法(与使用结果文本相比)是创建一个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
另一答案

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

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

上面的代码帮我解决了。

另一答案

我写了另一个替代CrLf的解决方法:

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

INSERT @results
Exec sp_helptext spStudyRoleCacheFlushNotificationGet

SELECT REPLACE(REPLACE([Text], CHAR(10), ''), CHAR(13), '')
FROM @results
另一答案

我一直在使用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('''+@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
另一答案

我也是为了一个观点而面对这个问题。

以下是我用来解决问题的步骤(请注意只是临时修复)

1)选择查询

2)然后右键单击并在查询设计器中打开

3)单击确定

你会注意到所有额外的空格都被删除了。

注意:这仅适用于简单查询而不适用于程序等

另一答案

有两种类型的解决方案可用于从sp_helptext输出中删除额外空间

  1. 转到工具>选项>查询结果>结果到文本(从下拉列表)
  2. 复制sp_helptext输出在Notepad ++中粘贴。通过按cntl + H打开查找和替换窗口输入以下文本以替换为给定图片中的新文本。 enter image description here

以上是关于SQL Server 2012 SP_HELPTEXT额外行问题的主要内容,如果未能解决你的问题,请参考以下文章

sql server2012密钥 用哪个

中文版sql server 2012是否只能够安装在中文版的windows server 2012上?

sql server 2012 一直卡在这

SQL Server 2012 官方版 / SQL Server 2012下载

如何卸载干净sql server2012

使用 Visual Studio 2012 和 SQL Server Management Studio 2012 运行 SQL Server CE 4 查询