回答

收藏

创建存储过程(如果尚不存在)

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

我想检查是否存在存储过程列表。我希望所有这些都在1个脚本中一个接一个地完成。到目前为止,我有这种格式:
$ Q0 K4 Q( r$ G! b# `) TUSE [myDatabase]
4 ?2 U& u0 U8 E+ Q1 J% X5 KGO
/ q% S5 J; j6 [; lIF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'sp_1')- G. K+ g# L, T5 D- A: U9 x7 I! N
BEGIN
5 K, |$ S6 Y8 K: D7 K' F- o6 gCREATE PROCEDURE sp_1
5 F; g/ J2 i# @AS; [2 V& k2 S5 B+ A2 t+ ^5 m
.................! ?+ q' y. O# \3 X) s
END# ^- o2 ?8 @+ h3 o" W
GO! B7 Z# F8 p, I7 A0 E
IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'sp_2')
. ]- a+ m7 E. ?% @BEGIN
" Y& {% _4 [- E+ x  cCREATE PROCEDURE sp_2
( t* L( i6 V6 \0 G) G* r: CAS
' H# G7 t4 E, V* g/ }0 ~.................* L2 D# M2 {8 z
END0 H; g; c6 n% |
GO
1 n& b) B: H- ]; F. l4 e1 O等等。但是,出现以下错误:+ P8 T  h: W, T" ^2 r, J

0 t2 m( _) U; I5 Y% ~$ s2 p关键字“过程”附近的语法不正确。
8 T% a$ S0 p! u; H1 {
: `* o0 m: u8 m
为什么我的工作不正常?# }. M1 D+ ^% O- }! s9 n, z  U
                5 w2 I9 K$ [/ f# h0 s) e
解决方案:5 s, E( H8 p2 C/ i
               
3 B: h2 ]; F) c. S
5 [  T# `6 d0 _/ p4 u6 d, g! J" M' G1 Q" v5 u  {5 f/ p
                CREATE PROCEDURE必须是批处理中的第一个语句。我通常会这样:
/ E# H! G7 u2 P. cIF EXISTS (
+ P# D$ v7 n# H        SELECT type_desc, type& v, o$ ^7 q( o! w) ^2 O/ C, Y: o0 t
        FROM sys.procedures WITH(NOLOCK)! O' ~5 P* A- u8 N0 ~/ J# G$ |
        WHERE NAME = 'myProc'
: W* B2 ~$ k0 X! a( X            AND type = 'P'
+ [; }2 H$ N+ G0 u, P      )
& S9 {& c6 A. y' {) @; w( v     DROP PROCEDURE dbo.myProc1 O3 H' H- J# N$ J/ D
GO/ R# u  }4 X6 o. V( ~! f
CREATE PROC dbo.myProc
# k0 n% e4 i/ _4 S: h# i5 I& r0 P" IAS' k7 _- K- B6 @9 z
....0 Q8 b: J) T0 c9 T
    GO
7 X9 v* z$ ?! M6 r, _1 n" q    GRANT EXECUTE ON dbo.myProc TO MyUser
3 d) J; Z6 Y' K9 G5 j; O! R(不要忘记授予声明,因为如果您重新创建proc,它们将会丢失)# B& e" W) @& z. s& Z: H! K
部署存储过程时要考虑的另一件事是,删除可以成功而创建失败。出现问题时,我总是使用回滚来编写SQL脚本。只要确保您不会在结尾时意外删除提交/回滚代码,否则您的DBA可能会在气管中将您吊起踢
9 m. c1 i: G! X! u* Q, UBEGIN TRAN
  K4 i/ D; c* W0 C5 Z3 f; t5 wIF EXISTS (# }7 G: l. |2 f# `
       SELECT type_desc, type
. H3 L+ X! z6 w) H+ ?3 }+ a0 R       FROM sys.procedures WITH(NOLOCK)
3 T1 V# z  d8 e) m! D9 Y       WHERE NAME = 'myProc'$ d4 J: ]2 |# E6 }  {
           AND type = 'P'
. w6 e; p: `$ @, R     )9 N. Q- \# N5 O7 f: @
DROP PROCEDURE myProc GO2 `0 L$ }4 L$ d0 T- R9 Z2 R
CREATE PROCEDURE myProc
2 `) I) F( s- L9 n# X: a& bAS
. x7 l4 C5 |' n6 {/ Y* P) j   --proc logic here
) O$ `- N" ~1 X2 T/ s' qGO7 h% W: f2 q7 f. S
-- BEGIN DO NOT REMOVE THIS CODE (it commits or rolls back the stored procedure drop) . J' S. |' Y0 r+ F* \' R; t; _' T
    IF EXISTS(# N8 W# Q* U; {! a
               SELECT 1
, R: Y* M3 |7 H7 S/ T9 Y1 c, ]6 E4 W               FROM sys.procedures WITH(NOLOCK)8 ]# \8 o. U/ D4 o
               WHERE NAME = 'myProc'$ r' ]$ M( p$ {7 {! y) j
                   AND type = 'P'
1 C9 ^* L* D+ r1 R4 ?9 G             )3 D. \# @- `" ]
        COMMIT TRAN+ {3 L* g3 A. Y  v1 U' j
        ELSE9 L  H4 d6 g4 l9 X
        ROLLBACK TRAN7 I" ^  K$ w# T+ g4 O+ n% K
-- END DO NOT REMOVE THIS CODE
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则