Powershell Invoke-Sqlcmd перезапускает сценарии с самого начала после ошибки - PullRequest
2 голосов
/ 12 февраля 2020

У меня есть файл .sql, который похож на приведенный ниже

BEGIN TRY
   PRINT 'Loading master data....'
   BEGIN TRANSACTION

   -- Some Insert scripts
   -- COPY Settings from DBOne to DBTwo

   PRINT 'Copy Settings Started...'
   INSERT INTO DBTWO.dbo.SETTINGS
   (Id,
    Code,
    Name)
   SELECT Id,Code,Name FROM DBONE.dbo.SETTINGS
   EXCEPT
   SELECT Id,Code,Name FROM DBTWO.dbo.SETTINGS

   PRINT 'Copy Settings completed...'

   COMMIT
END TRY
BEGIN CATCH
   ROLLBACK
END CATCH

Я запускаю сценарий sql с помощью следующей команды powershell

Invoke-Sqlcmd -ServerInstance ".\" -InputFile ".\Insert_Script.sql" -Verbose

Во время тестирования скрипта я заметил, что после печати текста «Copy Settings Started ...» скрипт снова запускается с начала, и я вижу, что операторы print в начале файла снова появляются, и когда элемент управления достигает INSERT INTO..EXCEPT, это не удалось с исключением тайм-аута.

Позже я обнаружил, что таблица 'DBTWO.dbo.SETTINGS' не существует, и после создания таблицы сценарий успешно выполнен без проблем.

Но вопрос в том, почему сценарий перезапустил снова с самого начала и потерпел неудачу на том же месте во время второго запуска. На этом этапе я даже проверил sp_who2, и это показало тупик, и жертва, и преступник - это один и тот же блок скрипта. Итак, со всеми этими объяснениями, вопрос остается без ответа: «Почему сценарий начался снова?»

Может кто-нибудь, пожалуйста, предоставьте более веские причины для такого поведения.

1 Ответ

1 голос
/ 12 февраля 2020

Похоже, это проблема самого сервера SQL. Microsoft подтвердила эту проблему на https://support.microsoft.com/en-us/help/4010159/fix-invoke-sqlcmd-cmdlet-executes-a-query-statement-multiple-times-if

Чтобы исправить это, рекомендуется установить обновления, как указано в приведенной выше ссылке.

С тех пор, как мой SQL версия сервера 2016, я установил пакет обновления SP2 и последнее накопительное обновление для SP2 (CU11). После установки я запустил сценарий, и он сам не запустился при первом запуске и правильно выдает ожидаемую ошибку («Неверное имя объекта ...»)

Этот SO пост помог мне найти ссылку выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...