回答

收藏

SQL:避免硬编码或幻数

技术问答 技术问答 151 人阅读 | 0 人回复 | 2023-09-13

问: 在SQL脚本或存储过程中,避免幻数或硬编码值还有哪些其他策略?- y! B5 V9 X8 s' I
考虑一个存储过程,该存储过程的工作是根据其StatusID或某些其他FK查找表或值的范围来检查/更新记录的值。
" w7 d4 S& I/ \, q  N考虑一个Status表,其中ID最重要,因为它是另一个表的FK:& x# ^/ {2 A+ r% ]4 C

/ X' I2 _# F  o" Z% G  ]% N  g3 O+ G* Y! h! F" x
; G! K4 e6 e- l; K8 v& S
应避免的SQL脚本 如下所示 :8 T& Q! X( h4 ?& M% i8 _
DECLARE  @ACKNOWLEDGED tinyint- S! ]3 S6 j7 I
SELECT  @ACKNOWLEDGED = 3   --hardcoded BAD* I0 T8 V! b9 G, }" ?2 _1 }
UPDATE  SomeTable
7 \, T6 B. q1 h# o0 mSET     CurrentStatusID = @ACKNOWLEDGED
- o/ `$ G8 d* yWHERE   ID = @SomeID
0 c* O" `$ o2 [( m这里的问题是,这不是可移植的,并且显式依赖于硬编码的值。在将其部署到另一个没有标识插入的环境时,存在细微的缺陷。
" P$ l/ U) x: x, I还尝试避免SELECT基于文本的描述/名称的状态:* Z' P4 Y6 J; i8 N3 }1 v
UPDATE  SomeTable9 V4 ~. X7 z5 Y# V
SET     CurrentStatusID = (SELECT ID FROM [Status] WHERE [Name] = 'Acknowledged')
+ b) t. a1 M) B" rWHERE   ID = @SomeID9 C% Z& E4 r3 l
问: 在SQL脚本或存储过程中,避免幻数或硬编码值还有哪些其他策略?
. p  U( v; Y% ?6 }关于如何实现此目标的其他一些想法:
, y3 v  Q1 q/ W0 G+ B" [添加一个新bit列(名称类似“ IsAcknowledged”)和一组规则,其中只能有一个值为的行1。这将有助于找到唯一的行:SELECT ID FROM [Status] WHERE [IsAcknowledged] = 1). k' Z# U9 U% L5 A" l. l

8 n. A/ ?3 S7 c' e: Z0 q                7 V+ o( G/ Y6 L; L) o
解决方案:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则