回答

收藏

在SQL Server中获取存储过程的文本

技术问答 技术问答 239 人阅读 | 0 人回复 | 2023-09-14

我正在尝试将旧的存储过程保存到字符串中。当我使用以下内容时,我不会出现任何换行符。! y2 i  K1 Z9 A3 U1 r8 A) H2 R- P
SELECT @OldProcedure = Object_definition(object_id)
  P% `2 K5 ?- {8 q2 `' gFROM   sys.procedures# X0 X. K) Z$ j8 Q, b- v
WHERE  name = @ProcedureName
/ U+ t0 S& W/ y# Y关于如何获取带有换行符的存储过程文本的任何建议?0 b7 |; P8 q% H* b! c
我正在考虑使用 sp_helptext
/ h+ S7 f# E  T1 x谢谢- ]& ^3 r; @+ `+ k. F9 p! P
更新
! C( Z6 N/ I3 H3 G# Z* f我正在复制并粘贴结果中的结果,这将显示给我一行。
8 {: u+ U' y" t' C7 S  h至于脚本,因为我将结果存储在db字段中。我正在创建一个可以即时生成过程的工具,但是我想创建它们的历史记录。
% o- ?. ^9 X9 T) _, K- i更新
- q5 z) U5 I! S0 g/ J4 s原来Object_definition可以满足我的要求,但是由于某种原因,当我从结果中复制它时,却得到了一行。
( m+ u# s5 v0 O6 j. j" u3 lDeclare @sql varchar(max) ;3 ^: p" `: D- ]; p+ q7 w
SELECT @sql=Object_definition(object_id)$ K! T6 R( [$ r3 {
FROM   sys.procedures
2 G: R: @. N) ZWHERE  name = 'Test_QueryBuilder';
$ ^9 Z, Z  g) Rdrop procedure Test_QueryBuilder
1 ?. G7 t9 C2 l- r# C1 M, g, Aexec( @sql)
( {5 D$ ^* d: [2 Oprint @sql
8 X/ Y8 J% d9 u2 H0 O! s% z                1 ]  Q: r0 L% L7 m- O2 s1 @" D
解决方案:* E* i5 M$ m; s% e
                . F3 _& C$ K. B
8 q. k; W* j9 D7 w$ O! o
! B7 b( n! K0 ?7 K# }
                我最近遇到了一个相同的问题,并制作了一个快速而肮脏的脚本来获取视图的定义,但是同样的事情也可以用于存储过程和函数。
8 B- A! H6 j2 VDECLARE @Lines TABLE (Line NVARCHAR(MAX)) ;
) {  y1 s- A9 {6 O: |DECLARE @FullText NVARCHAR(MAX) = '' ;
8 D1 v' r  K9 F% R% w" u2 g2 g! S6 d" YINSERT @Lines EXEC sp_helptext 'sp_ProcedureName' ;
- W% ~  a" ^  h2 i2 ^  ?! ]SELECT @FullText = @FullText + Line FROM @Lines ;
" v6 D9 z2 I: f: ]9 Z! U# VPRINT @FullText ;" B; u$ X" b& U. V) k
它只是sp_helptext按照您的建议使用,在表变量中获取其输出,并将所有结果行连接到文本变量中。它还使用以下事实:sp_helptext结果集中的每一行都包含尾随换行符,因此无需在此处添加它。
; O3 O0 D2 S! V; ?+ J- z从那里开始,您只需像平常一样使用变量,即可将其打印,保存到某个表或对其进行一些操作。我的特殊用例是构建一个辅助存储过程,以删除视图并在修改其基础表时重新创建它。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则