Можно ли выбрать RAISERROR или THROW в зависимости от версии SQL Server?

Вот мой код прямо сейчас:

BEGIN TRY
INSERT INTO TABLE (F1,F2,F3) 
VALUES ('1','2','3')
END TRY
BEGIN CATCH
;THROW
END CATCH

Отлично работает, если он не запущен на машине с SQL 2008. Я бы хотел, чтобы блок CATCH делал чек против версии SQL и запускал THROW, если он равен или выше, до 2012 года, и RAISERROR, если это 2008 год. I продолжайте работать в синтаксических ошибках, и мне интересно, возможно ли это. Даже что-то вроде этого не работает для меня.

BEGIN CATCH
IF ((SELECT SERVERPROPERTY('productversion')) >= 11) ;THROW
END CATCH

Любые советы приветствуются.

12 голосов | спросил thomasjbarrett 11 SunEurope/Moscow2016-12-11T06:31:14+03:00Europe/Moscow12bEurope/MoscowSun, 11 Dec 2016 06:31:14 +0300 2016, 06:31:14

2 ответа


9

Нет, это невозможно.

Это недопустимый синтаксис в более ранних версиях и приведет к ошибке компиляции.

Невозможно скрыть THROW в EXEC внутри блока catch либо как беззаметный бросок должен быть непосредственно заключен в catch.

Вам потребуется развернуть нужную версию кода в соответствии с версией SQL Server, на которую вы развертываете (и, к сожалению, нет никакой поддержки для этого либо в оснастке SSDT, о которой я знаю, не эквивалент кода линии выборочно посредством условной компиляции)

ответил Martin Smith 11 SunEurope/Moscow2016-12-11T12:29:58+03:00Europe/Moscow12bEurope/MoscowSun, 11 Dec 2016 12:29:58 +0300 2016, 12:29:58
3

Я верю ответ Мартина Смита почти на 100% прав.

Единственный способ сделать это - с динамическим SQL, и вам придется дублировать огромное количество вашего кода, обернув все ваши блоки try /catch (или весь оператор процедуры создания, если у вас будет две версии из всех тех), которые выполняются в зависимости от версии.

Это будет кошмар для поддержания. Не делайте этого.

Есть ли способ выполнить инструкцию SQL на основе версии SQL Server?

ответил SqlZim 11 SunEurope/Moscow2016-12-11T17:40:45+03:00Europe/Moscow12bEurope/MoscowSun, 11 Dec 2016 17:40:45 +0300 2016, 17:40:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132