20

我正在使用 SQL Server 2012,并且总是SP_HELPTEXT用来获取我以前创建的存储过程,在以前版本的 SQL Server 中,这个过程没有问题,但是在 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 服务器的配置如下(从Help -> About复制)

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

提前谢谢。

4

8 回答 8

24

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

这似乎是对sp_helptext以前版本的行为的更改,因为标准网格结果集不显示此效果。

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

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

于 2012-06-16T10:06:46.997 回答
6

在我看来,一个更好的解决方法(与使用结果到文本相比)是创建一个 sp_helptext2 存储过程,如下所述:

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
于 2012-11-01T14:55:28.830 回答
6

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

即使这删除了“原始回车符”,但这也更好。我通过 DB 从 SQL 2008 迁移到 SQL 2012,并且在使用 sp_helptext 时,所有存储过程(超过 200 个)在每行代码后都返回了大约 5 个回车符。

上面的代码帮助我解决了它。

于 2013-09-15T07:56:54.917 回答
0

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

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

INSERT @results
Exec sp_helptext spStudyRoleCacheFlushNotificationGet

SELECT REPLACE(REPLACE([Text], CHAR(10), ''), CHAR(13), '')
FROM @results
于 2013-08-19T21:31:37.500 回答
0

我一直在使用 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
于 2018-09-04T21:40:07.990 回答
0

使用下面的查询来获得准确的 SP 查询,没有额外的空格:

(SELECT  OBJECT_DEFINITION (OBJECT_ID('SPname' )))
于 2020-08-31T10:53:56.493 回答
-1

我也面临这个问题的看法。

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

1)选择查询

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

3)点击确定

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

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

于 2014-06-17T05:23:03.507 回答
-1

有两种解决方案可用于从 sp_helptext 输出中删除多余的空间

  1. 转到工具>选项>查询结果>结果到文本(从下拉列表中)
  2. 复制 sp_helptext 输出 在 Notepad++ 中粘贴。按 cntl+H 打开查找和替换窗口,输入以下文本以替换为给定图片中的新文本。 在此处输入图像描述
于 2018-06-05T13:23:53.237 回答