使用 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 循环?

更改代码块的 emacs 组织模式键绑定

sqlgo是啥意思,如何使用?

sql中的begin catch 。。。end catch 的用法

SQL2005 异常处理机制(Begin try Begin Catch)