Изменение уровня совместимости позволяет «имитировать» старую/другую версию SQL Server. Таким образом, вы можете изменить уровень совместимости перед запуском запроса, чтобы определить, будет ли данный запрос работать корректно с определенной версией SQL Server.
Синтаксис:
ALTER DATABASE [YourDBname] SET COMPATIBILITY_LEVEL = x
где х уровень совместимости:
- 140: SQL Server vNext
- 130: SQL Server 2016
- 120: базы данных SQL
- 120: SQL Server 2014
- 110: S QL Сервер 2012
- 105: SQL Server 2008 R2
- 100: SQL Server 2008
- 90: SQL Server 2005
- 80: SQL Server 2000
См MSDN для более подробной информации
Например, функция string_split()
была введена в SQL Server 2016 (уровень совместимости 130), поэтому выполняется запрос, содержащий string_split()
с уровнем совместимости ниже 130 приведет к ошибке:
ALTER DATABASE [YourDBname] SET COMPATIBILITY_LEVEL = 130
go
select value from string_split('1_2_3_4','_')
ALTER DATABASE [YourDBname] SET COMPATIBILITY_LEVEL = 120
go
select value from string_split('1_2_3_4','_')
Первый запрос будет выполнен правильно, в то время как второй будет давать следующее сообщение об ошибке:
Msg 208, Level 16, State 1, Line 9 Invalid object name 'string_split'.
Edit: Как указывалось by Damien_The_Unbeliever в комментариях есть некоторые ограничения с этим подходом. Каждая версия SQL Server может поддерживать только ограниченное количество значений уровня совместимости.
Согласно MSDN значений здесь поддерживаются на уровне совместимости для каждой версии (подробнее here):
+--------------------+--------------------------------------+
| Product | Supported Compatibility Level Values |
+--------------------+--------------------------------------+
| SQL Server vNext | 140, 130, 120, 110, 100 |
| SQL Server 2016 | 130, 120, 110, 100 |
| SQL Database | 130, 120, 110, 100 |
| SQL Server 2014 | 120, 110, 100 |
| SQL Server 2012 | 110, 100, 90 |
| SQL Server 2008 R2 | 100, 90, 80 |
| SQL Server 2008 | 100, 90, 80 |
| SQL Server 2005 | 90, 80 |
| SQL Server 2000 | 80 |
+--------------------+--------------------------------------+
Согласно этой таблице, с последними версиями SQL Server (2016, 2014) вы можете пойти назад до SQL Server 2008, но вы не можете вернуться к SQL Server 2005 или 2000
Этот запрос будет работать с любой версией или редакцией, поэтому не беспокойтесь. –
@ M.Ali Я думаю, что OP означал это как пример и, возможно, захочет проверить более сложные запросы. –
@M.Али Спасибо! Могу ли я спросить, подходит ли это для следующего? INSERT INTO TABLE_A (COLA_ID, COLA_1, COLA_2) \t SELECT COLB_ID, COLB_1, COLB_2 FROM TABLE_B; –