使用 BEGIN / END 组织 SQL 代码有啥危害吗?
Posted
技术标签:
【中文标题】使用 BEGIN / END 组织 SQL 代码有啥危害吗?【英文标题】:Any harm in using BEGIN / END to organize SQL code?使用 BEGIN / END 组织 SQL 代码有什么危害吗? 【发布时间】:2018-09-20 14:54:56 【问题描述】:我不太习惯写很长的 SP。而且我发现在使用这些宽表时很快就变得难以管理。即使是一个简单的 UPSERT 也需要很长的一行代码或数十行代码(我发现 col/line 样式对我来说更容易阅读,但使用那些非常宽的表对我来说真的很痛苦)。渐渐地,我发现自己开始使用 BEGIN/END 将这些 UPSERT 和其他基本操作包装在同一张表等上,以将它们分组为逻辑部分。这样在 IDE 中它们可以轻松折叠和展开,以便使用 cmets 进行检查和查看。注意:我不是为任何控制块编写它们。只需简单的 BEGIN/END 即可将它们包装成可折叠的部分。
在分组和折叠/展开冗长的代码中添加一些额外的 BEGIN/END 会导致任何副作用吗?目前我还没有看到... 如果是这样,他们会是什么?有没有更好的方法在 SP 中组织这些代码?
哦,我的意思是折叠
CREATE PROCEDURE/MULT_STATEMENT_FUNCTION
...
BEGIN
-- UPSERT QC records
BEGIN
UPDATE QC_SECT1 <-- fold[]
SET COL1=...
COL2=
.....
IF @@ROWCOUNT.... <--fold[ click 1]
INSERT INTO ... <-Fold[click 2]
(
COL1
....
VALUES <-Fold[click 3]
(
...
END
-- calculate distribution
BEGIN
DECLARE @GRP1_.....
DECLARE @GRP2_....
WITH .....
....
) AS PRE_CAL1 <-- fold[click 1]
) AS PRE_CAL2 <-- fold[click 2]
) AS ... <-- fold[click 3]
END
END
我发现检查长脚本非常不方便,逐渐我发现自己开始使用 BEGIN/END。在 VSCode 中,折叠单个 CTE 语句需要多次点击。 BEGIN/END 让它变得容易多了。但我真的很想确定,我做错了什么。
PS:按行分组列的想法非常有效,我完全同意。 关于 col/line 样式。并不是我真的很喜欢它。但我想在我目前的情况下,很多人可能也会喜欢它。供应商数据库中的宽表有很长的前缀,我会说,对列进行分组。垂直列出它们有助于对齐它们,以便更容易区分它们......我想我目前是一个特例。
谢谢。
【问题讨论】:
不,这根本不是问题。但这是一个问题,除了少数例外,存储过程不应该是大型进程。诸如发布批次或索赔支付之类的事情可能需要这样做,但大多数事情应该是快速和小型的数据操作。 你到底在说什么? 似乎您在问语法CREATE PROC YouSP AS BEGIN Part 1 END BEGIN Part 2 END BEGIN Part 3 ... END
好吗?如果是这样,答案是否定的。
@Larnu 我认为你在评论中所说的问题的答案实际上是“是”
天啊!谢谢@iamdave。这绝对是那些星期之一......
SSMS 支持Code Outlining,这是一种隐藏当前不感兴趣的代码的便捷方式。我不喜欢“每列带前导逗号的行”格式。我尝试对相关列进行分组,例如一个连接表中的名字和姓氏或列,放在一行上。当语句在另一行继续时,我会以悬空的东西结束该行,例如,
或 inner join
,因此即使该行恰好位于窗口底部,也很明显缺少某些内容。
【参考方案1】:
你可以这样做。像这样构造代码是个好主意,因为它以 cmets 没有的方式与语言和 IDE 集成。在 C 语言中,我有时会使用 块,以防需要更大的方法。
我发现 col/line 样式对我来说更容易阅读
如果这对您来说更容易,那么它是有道理的。但也许训练你的眼睛接受一种多列在一条线上的样式也是有意义的。这节省了大量的垂直空间。在同一屏幕上更适合,清晰度也会提高。
【讨论】:
【参考方案2】:不,绝对不是。在 BEGIN/END 块中包装代码块没有害处。我已经这样做了 10 多年,没有任何后果。优化器基本上会忽略它,除非有理由评估 BEGIN/END 逻辑(例如,对于循环或其他“WHILE”条件)。
在 SSMS 中使用 BEGIN/END 代码块可以快速折叠/展开大型代码块。下面是我正在处理的一些代码,用于收集一些常规元数据。它有 110 行代码,但易于阅读。
【讨论】:
以上是关于使用 BEGIN / END 组织 SQL 代码有啥危害吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 while-begin-end 循环时 SQL native 和 JDBC 的区别
如何在 SQL Server 中组织无限 while 循环?