Проблемы с производительностью из-за заявления GOTO - PullRequest
0 голосов
/ 16 марта 2020

Я использую 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.

1 Ответ

1 голос
/ 16 марта 2020

Вы можете заменить операторы 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

Демонстрация на dbfiddle.uk

...