首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL server 2012 SP_HELPTEXT额外行问题

SQL server 2012 SP_HELPTEXT额外行问题
EN

Stack Overflow用户
提问于 2012-06-16 15:31:15
回答 8查看 28.1K关注 0票数 20

我正在使用SQL server 2012,并且总是使用SP_HELPTEXT来获取我以前创建的存储过程,在以前的SQL server版本中,这个过程没有问题,但是在2012年,我的存储过程附带了额外的行,例如,这是我编写的过程。

代码语言:javascript
复制
Create proc SP_Test
as
begin
 Select * 
 from table_ABC
end

现在,在此过程(或任何其他过程)中使用SP_HELPTEXT之后,我将获得以下输出

代码语言:javascript
复制
Create proc SP_Test

as

begin

 Select * 

 from table_ABC

end

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

我的SQL server配置如下(从关于的Help ->复制)

代码语言:javascript
复制
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

提前谢谢。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-06-16 18:06:47

如果我在设置了Results to grid的情况下运行sp_helptext,然后将网格中的结果复制并粘贴到新的查询或任何其他文本编辑器中,则可以复制此行为。

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

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

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

票数 24
EN

Stack Overflow用户

发布于 2012-11-01 22:55:29

在我看来,一个更好的解决方法(与将结果转换为文本相比)是创建一个sp_helptext2 storedproc,如下所述:

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

注意:该解决方案有一个bug,如果末尾没有新行,则会省略最后一行。更正的T-SQL:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2013-09-15 15:56:55

Rufo发布的答案仍然会产生空行。最后一行代码中的一些小改动为我解决了这个问题。以下是编辑后的代码:

代码语言:javascript
复制
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

尽管这删除了“原始回车”,但这是更好的生活方式。我用DB从SQL2008迁移到SQL2012,在使用sp_helptext时,所有的存储过程(超过200个)在每一行代码后都返回了大约5个回车符。

上面的代码帮助我解决了这个问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11061642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档