2012-06-16 49 views
17

我正在使用SQL Server 2012,&总是使用SP_HELPTEXT来获得我以前创建的存储过程。在以前版本的SQL Server中,在此过程中没有问题,但在2012年,我的存储过程有额外的线路,例如这是我使用SP_HELPTEXT此程序(或任何其他程序)后写道SQL Server 2012 SP_HELPTEXT额外行问题

Create proc SP_Test 
as 
begin 
Select * 
from table_ABC 
end 

现在的过程中,我得到这个输出

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提前。

+0

在此处看不到此行为(SQL Server Express 2012)。 –

+0

我已经提到了我的版本的配置,也请看看它 – yogi

+0

您可能知道这一点,但您可以右键单击一个存储过程,'Modify'将为您提供源代码。 RedGate免费的[SQL Search](http://www.red-gate.com/products/sql-development/sql-search/)可帮助您快速选择存储过程。 – Andomar

回答

17

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

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

最简单的变通办法将与Results to text集(Query运行sp_helptext - >Results to>Results to text,快捷CTRL + T

您可能需要增加Results to text每行的字符的最大数量来获得输出你期望 - Tools>Options>Query Results>Results to text - 设置为8192

+2

是的结果文本工作正常,thanx :) – yogi

5

更好WOR最大值“在各列中显示的最大字符数” karound(相对于使用效果文本)在我看来是因为这里解释创建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 
+0

对不起@rufo ..你的回答不起作用 – Rama

+0

@Dram:对不起 - 它为我工作了多年。我刚刚停止使用,因为如果您有SSMS 2014,则不需要。 – rufo

0

我写了另一个解决办法,只是替换CRLF:

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

INSERT @results 
Exec sp_helptext spStudyRoleCacheFlushNotificationGet 

SELECT REPLACE(REPLACE([Text], CHAR(10), ''), CHAR(13), '') 
FROM @results 
5

发表入佛门仍然会产生空行的答案。最后一行代码中的一点变化为我解决了这个问题。这里是编辑的代码:

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,并且在使用sp_helptext时,所有存储过程(超过200个)在每行代码后返回约5个回车符。

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

+0

感谢@Ish Goel提供的代码。它帮助了我 – Ram

0

我也面临这个问题的观点。

下面是步骤i用来解决该问题(注意只是一个临时的解决办法)

1)选择查询

2)然后右击并在查询设计

3)单击打开好吧

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

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