由于GOTO声明而导致的性能问题

时间:2020-03-16 09:38:57

标签: sql-server database-project

我正在使用SQL Server 2016数据库项目,我的脚本如下所示

DECLARE Marker NVARCHAR(50) = (SELECT Value FROM Table1 WHERE name = 'Marker') 
IF( IS NOT NULL)
BEGIN
    IF @Marker = 'Marker1' GOTO Marker2;
    IF @Marker = 'Marker2' GOTO Marker3;
    IF @Marker = 'Marker3' GOTO Marker4;
    IF @Marker = 'Marker4' GOTO Marker5;
    IF @Marker = 'Marker5' GOTO Marker6;
    IF @Marker = 'Marker6' GOTO Marker7;        
    ELSE GOTO EmptyBlock;    
END 

MARKER1:
Code for marker 1

MARKER2:
Code for marker 2    

MARKER3:
Code for marker 3
.
.
.
EmptyBlock:
PRINT 'No changes'

此脚本文件将在每次部署后执行,并且基于部署,它将跳过前几行,现在将到达标记15

即使只有几行代码,执行时间仍然很长,由于 GOTO语句,我终于找到了问题。我不知道使用GOTO是否是最佳做法,如果不是在生产现场使用GOTO的好习惯,那么请给我有关替代GOTO的建议。

1 个答案:

答案 0 :(得分:1)

您可以使用GOTO用这样的脚本替换IF语句:

-- get the number of the marker (instead of the full name of the marker).
DECLARE @Marker INT = (SELECT REPLACE(Value, 'Marker', '') FROM Table1 WHERE name = 'Marker')

IF @Marker IS NULL
  BEGIN
    PRINT 'no marker'
  END
IF @Marker < 1
  BEGIN
    -- Code for Marker No. 1
  END
IF @Marker < 2
  BEGIN
    -- Code for Marker No. 2
  END
IF @Marker < 3
  BEGIN
    -- Code for Marker No. 3
  END
IF @Marker < 4
  BEGIN
    -- Code for Marker No. 4
  END
ELSE IF @Marker IS NOT NULL
  BEGIN
    PRINT 'no changes'
  END

demo on dbfiddle.uk