为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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