注册

如何改写SQLServer的sp_helptext存储过程,改写为DM--请各位大神帮帮忙

阿杰升级路 2024/01/04 534 0

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:win11
【CPU】:
【问题描述】*:如何改写SQLServer的sp_helptext存储过程
sql sp_helptext 代码

create procedure sys.sp_helptext @objname nvarchar(776), @columnname sysname=null
as
set nocount on
declare @dbname        sysname, @objid int, @BlankSpaceAdded int, @BasePos int, @CurrentPos int, @TextLength int, @LineId int, @AddOnLen int, @LFCR int, --lengths of line feed carriage return  
        @DefinedLength int, /* NOTE: Length of @SyscomText is 4000 to replace the length of  
** text column in syscomments.  
** lengths on @Line, #CommentText Text column and  
** value for @DefinedLength are all 255. These need to all have  
** the same values. 255 was selected in order for the max length  
** display using down level clients  
*/
        @SyscomText    nvarchar(4000), @Line nvarchar(255)
select @DefinedLength=255
select @BlankSpaceAdded=0 /*Keeps track of blank spaces at end of lines. Note Len function ignores  
                             trailing blank spaces*/
create table #CommentText (LineId int, Text nvarchar(255) collate catalog_default)

/*  
**  Make sure the @objname is local to the current database.  
*/
select @dbname=parsename(@objname, 3)
if @dbname is null
  select @dbname=db_name()
else if @dbname<>db_name()
begin
  raiserror(15250, -1, -1)
  return (1)
end

/*  
**  See if @objname exists.  
*/
select @objid=object_id(@objname)
if(@objid is null)
begin
  raiserror(15009, -1, -1, @objname, @dbname)
  return (1)
end

-- If second parameter was given.  
if(@columnname is not null)
begin
  -- Check if it is a table  
  if(select count(*)from sys.objects where object_id=@objid and type in ('S ', 'U ', 'TF'))=0
  begin
    raiserror(15218, -1, -1, @objname)
    return (1)
  end
  -- check if it is a correct column name  
  if((select 'count'=count(*)from sys.columns where name=@columnname and object_id=@objid)=0)
  begin
    raiserror(15645, -1, -1, @columnname)
    return (1)
  end
  if(columnproperty(@objid, @columnname, 'IsComputed')=0)
  begin
    raiserror(15646, -1, -1, @columnname)
    return (1)
  end
  declare ms_crs_syscom cursor local for
  select     text
    from     syscomments
    where    id=@objid and encrypted=0 and number=(select column_id from sys.columns where name=@columnname and object_id=@objid)
    order by number, colid
  for read only
end
else if @objid<0 -- Handle system-objects  
begin
  -- Check count of rows with text data  
  if(select count(*)from master.sys.syscomments where id=@objid and text is not null)=0
  begin
    raiserror(15197, -1, -1, @objname)
    return (1)
  end
  declare ms_crs_syscom cursor local for
  select text from master.sys.syscomments where id=@objid order by number, colid for read only
end
else
begin
  /*  
        **  Find out how many lines of text are coming back,  
        **  and return if there are none.  
        */
  if(select count(*)from syscomments c, sysobjects o where o.xtype not in ('S', 'U')and o.id=c.id and o.id=@objid)=0
  begin
    raiserror(15197, -1, -1, @objname)
    return (1)
  end
  if(select count(*)from syscomments where id=@objid and encrypted=0)=0
  begin
    raiserror(15471, -1, -1, @objname)
    return (0)
  end
  declare ms_crs_syscom cursor local for
  select text from syscomments where id=@objid and encrypted=0 order by number, colid for read only
end

/*  
**  else get the text.  
*/
select @LFCR=2
select @LineId=1
open ms_crs_syscom
fetch next from ms_crs_syscom
into @SyscomText
while @@fetch_status>=0
begin
  select @BasePos=1
  select @CurrentPos=1
  select @TextLength=len(@SyscomText)
  while @CurrentPos !=0
  begin
    --Looking for end of line followed by carriage return  
    select @CurrentPos=charindex(char(13)+char(10), @SyscomText, @BasePos)

    --If carriage return found  
    if @CurrentPos !=0
    begin
      /*If new value for @Lines length will be > then the  
            **set length then insert current contents of @line  
            **and proceed.  
            */
      while(isnull(len(@Line), 0)+@BlankSpaceAdded+@CurrentPos-@BasePos+@LFCR)>@DefinedLength
      begin
        select @AddOnLen=@DefinedLength-(isnull(len(@Line), 0)+@BlankSpaceAdded)
        insert #CommentText values(@LineId, isnull(@Line, N'')+isnull(substring(@SyscomText, @BasePos, @AddOnLen), N''))
        select @Line=null, @LineId=@LineId+1, @BasePos=@BasePos+@AddOnLen, @BlankSpaceAdded=0
      end
      select @Line=isnull(@Line, N'')+isnull(substring(@SyscomText, @BasePos, @CurrentPos-@BasePos+@LFCR), N'')
      select @BasePos=@CurrentPos+2
      insert #CommentText values(@LineId, @Line)
      select @LineId=@LineId+1
      select @Line=null
    end
    else
    --else carriage return not found  
    begin
      if @BasePos<=@TextLength
      begin
        /*If new value for @Lines length will be > then the  
                **defined length  
                */
        while(isnull(len(@Line), 0)+@BlankSpaceAdded+@TextLength-@BasePos+1)>@DefinedLength
        begin
          select @AddOnLen=@DefinedLength-(isnull(len(@Line), 0)+@BlankSpaceAdded)
          insert #CommentText values(@LineId, isnull(@Line, N'')+isnull(substring(@SyscomText, @BasePos, @AddOnLen), N''))
          select @Line=null, @LineId=@LineId+1, @BasePos=@BasePos+@AddOnLen, @BlankSpaceAdded=0
        end
        select @Line=isnull(@Line, N'')+isnull(substring(@SyscomText, @BasePos, @TextLength-@BasePos+1), N'')
        if len(@Line)<@DefinedLength and charindex(' ', @SyscomText, @TextLength+1)>0
        begin
          select @Line=@Line+N' ', @BlankSpaceAdded=1
        end
      end
    end
  end
  fetch next from ms_crs_syscom
  into @SyscomText
end
if @Line is not null
  insert #CommentText values(@LineId, @Line)
select Text from #CommentText order by LineId
close ms_crs_syscom
deallocate ms_crs_syscom
drop table #CommentText
return (0) -- sp_helptext  
回答 0
暂无回答
扫一扫
联系客服