2017-01-25 4 views
0

Я хочу проверить, будут ли сценарии SQL, которые я написал, будут успешно выполняться на SQL Server, независимо от версии SQL Server (или начиная с определенной версии SQL Server).Как узнать, в какой версии SQL Server начал поддерживать определенную функцию?

Например: Как проверить, будет ли следующий SQL-запрос работать в старых версиях SQL Server?

UPDATE TABLE_A 
SET TABLE_A.COL_1= TABLE_B.COL_1 
FROM TABLE_A AS TABLE_A 
LEFT JOIN 
TABLE_B AS TABLE_B 
ON (TABLE_A.COL_ID=TABLE_B.COL_ID); 
+0

Этот запрос будет работать с любой версией или редакцией, поэтому не беспокойтесь. –

+0

@ M.Ali Я думаю, что OP означал это как пример и, возможно, захочет проверить более сложные запросы. –

+0

@M.Али Спасибо! Могу ли я спросить, подходит ли это для следующего? INSERT INTO TABLE_A (COLA_ID, COLA_1, COLA_2) \t SELECT COLB_ID, COLB_1, COLB_2 FROM TABLE_B; –

ответ

1

Изменение уровня совместимости позволяет «имитировать» старую/другую версию 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

+1

Возможно, вам понадобится ряд серверов, если вы хотите протестировать все уровни совместимости, хотя, например, сервер 2014 (120) может выполнять совместимость только в 2008 году (100). Я считаю, что общая политика заключается в том, что любая версия может выполнять совместимость с двумя основными версиями. –

+0

@Damien_The_Unbeliever Да, вы правы: возможно, невозможно протестировать все версии SQL Server с помощью этого tecnique. По-видимому, с моим экземпляром SQL Server 2016 я могу вернуться к уровню совместимости 100 (SQL Server 2008), но не дальше. – Andrea

+0

@ Андреа Спасибо! это было так полезно. –