使用 BEGIN / END 组织 SQL 代码有什么坏处?
Any harm in using BEGIN / END to organize SQL code?
我不太习惯写很长的SP。而且我发现在使用那些宽 table 时,它很快变得难以管理。即使是一个简单的 UPSERT 也需要很长的一行或几十行代码(我发现 col/line 样式对我来说更容易阅读,但是使用那些非常宽的 tables 是对我来说真的很痛苦)。渐渐地,我发现自己开始使用 BEGIN/END 将那些 UPSERT 和其他基本操作包装在相同的 table 等上,以将它们分组到逻辑部分。这样在 IDE 中它们可以很容易地折叠和展开,以检查和评论评论。注意:我没有为任何控制块编写它们。只需 BEGIN/END 将它们包裹成一个可折叠的部分即可。
向组中添加一些额外的 BEGIN/END 和 fold/unfold 冗长的代码会导致任何副作用吗?目前我还没有看到任何......
如果是这样,他们会是什么?有没有更好的方法在 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 样式。并不是我真的很喜欢它。但我想在我目前的情况下,很多人可能也会喜欢它。供应商数据库中的宽 tables 有很长的前缀,我想说,对列进行分组。垂直列出它们有助于对齐它们,以便更容易区分它们......我想我现在是一个特例。
谢谢。
你可以做到。像这样构建代码是个好主意,因为它以注释所没有的方式与语言和 IDE 集成在一起。在 C 语言中,我有时会使用 {}
块,以防需要更大的方法。
I found the col/line style easier to read for me
如果这对您来说更容易,那就有意义了。但也许训练您的眼睛接受许多列排成一行的样式也很有意义。这节省了大量的垂直 space。同屏显示更多内容,清晰度提升。
不,绝对不是。将代码块包装在 BEGIN/END 块中没有坏处。我已经这样做了 10 多年,没有任何后果。优化器基本上会忽略它,除非有理由评估 BEGIN/END 逻辑(例如,对于循环或其他 "WHILE" 条件。)
在 SSMS 中使用 BEGIN/END 代码块可以快速 collapse/expand 大代码块。下面是我正在收集一些例行元数据的一些代码。它只有 110 行代码,但易于阅读。
我不太习惯写很长的SP。而且我发现在使用那些宽 table 时,它很快变得难以管理。即使是一个简单的 UPSERT 也需要很长的一行或几十行代码(我发现 col/line 样式对我来说更容易阅读,但是使用那些非常宽的 tables 是对我来说真的很痛苦)。渐渐地,我发现自己开始使用 BEGIN/END 将那些 UPSERT 和其他基本操作包装在相同的 table 等上,以将它们分组到逻辑部分。这样在 IDE 中它们可以很容易地折叠和展开,以检查和评论评论。注意:我没有为任何控制块编写它们。只需 BEGIN/END 将它们包裹成一个可折叠的部分即可。
向组中添加一些额外的 BEGIN/END 和 fold/unfold 冗长的代码会导致任何副作用吗?目前我还没有看到任何...... 如果是这样,他们会是什么?有没有更好的方法在 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 样式。并不是我真的很喜欢它。但我想在我目前的情况下,很多人可能也会喜欢它。供应商数据库中的宽 tables 有很长的前缀,我想说,对列进行分组。垂直列出它们有助于对齐它们,以便更容易区分它们......我想我现在是一个特例。
谢谢。
你可以做到。像这样构建代码是个好主意,因为它以注释所没有的方式与语言和 IDE 集成在一起。在 C 语言中,我有时会使用 {}
块,以防需要更大的方法。
I found the col/line style easier to read for me
如果这对您来说更容易,那就有意义了。但也许训练您的眼睛接受许多列排成一行的样式也很有意义。这节省了大量的垂直 space。同屏显示更多内容,清晰度提升。
不,绝对不是。将代码块包装在 BEGIN/END 块中没有坏处。我已经这样做了 10 多年,没有任何后果。优化器基本上会忽略它,除非有理由评估 BEGIN/END 逻辑(例如,对于循环或其他 "WHILE" 条件。)
在 SSMS 中使用 BEGIN/END 代码块可以快速 collapse/expand 大代码块。下面是我正在收集一些例行元数据的一些代码。它只有 110 行代码,但易于阅读。