mysql sp print_SQLServer存储过程Print

本文介绍了SQLServer的存储过程sp_PrintProc,用于打印其他存储过程或函数对象的创建语句。该过程可以从系统自带的存储过程中获取代码,并提供了详细的操作步骤,包括如何处理不同类型的数据库对象和文本数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQLServer 存储过程,打印其他存储过程或函数对象的创建语句 代码来源于系统自带的存储过程 无 Create PROCEDURE [dbo].[sp_PrintProc] @objname NVARCHAR(776) , @columnname SYSNAME = NULLAS --打印对象 SET nocount ON DECLARE @dbname SYSNAME , @objid

SQLServer 存储过程,打印其他存储过程或函数对象的创建语句

代码来源于系统自带的存储过程

05bbf43f4f77f367f3dfe59f347e863b.png

Create PROCEDURE [dbo].[sp_PrintProc]

@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 2550. These need to all have

** the same values. 2550 was selected in order for the max length

** display using down level clients

*/ ,

@SyscomText NVARCHAR(4000) ,

@Line NVARCHAR(2550)

SELECT @DefinedLength = 2550

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(2550) COLLATE database_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 + ' ' ,

@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 )

DECLARE @printLine NVARCHAR(2550)

DECLARE PostCur CURSOR FOR

SELECT Text FROM #CommentText ORDER BY LineId

OPEN PostCur

FETCH NEXT FROM PostCur INTO @printLine

WHILE @@fetch_status = 0

BEGIN

PRINT @printLine

FETCH NEXT FROM PostCur INTO @printLine

END

CLOSE PostCur

DEALLOCATE PostCur

CLOSE ms_crs_syscom

DEALLOCATE ms_crs_syscom

DROP TABLE #CommentText

RETURN (0) -- sp_PrintProc

--存储过程查询

declare @StrSql varchar(max)

set @StrSql=(

Select 'exec('+char(39)+'sp_PrintProc '+name+char(39)+');' as [data()] From sys.objects where Type='P' and name like 'softManage_%' for xml path('')

)

exec(@StrSql)

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值