У меня есть сценарий, который использует функции, отсутствующие в SQL Server 2000. В частности, сценарий создает хранимую процедуру, которая использует тип данных, добавленный в SQL Server 2005.
Мне нужно использовать условную логику, чтобы гарантировать, что (1) версия сервера - 2005 или новее и (2) уровень совместимости целевой базы данных - 2005 или новее. Кроме того, этот сценарий должен выполняться без ошибок на SQL Server 2000, очевидно, без фактического добавления новой хранимой процедуры.
Я успешно разбираю SERVERPROPERTY('productversion')
чтобы определить версию сервера. Однако все, что я могу найти о доступе к ссылкам на уровни совместимости SELECT COMPATIBILITY_LEVEL FROM sys.databases WHERE [name] = ('DBName')
для SQL Server 2005+ и выбирая из sysdatabases
на SQL Server 2000. К сожалению, ни один из этих методов не работает на всех четырех версиях SQL Server, на которых он должен работать (2000, 2005, 2008, 2008R2).
Идеи?
Это работает для 2000 и выше:
select name,cmptlevel from master.dbo.sysdatabases
Я не знаю, есть ли для вас что-нибудь лучше, чем приведенное ниже решение.
Выполните следующие действия и запишите результаты в таблицу.
CREATE TABLE #DBCC (
ParentObject VARCHAR (255)
, [Object] VARCHAR (255)
, Field VARCHAR (255)
, [Value] VARCHAR (255)
)
INSERT INTO #DBCC
EXEC ('DBCC DBINFO WITH TABLERESULTS')
DECLARE @val INT
SELECT @val = Value FROM #DBCC WHERE field = 'dbi_version'
IF ( @val >= 611 )
BEGIN
SELECT compatibility_level FROM sys.databases WHERE database_id = DB_ID();
--Deploy 2005 and above stuff
END
ELSE
BEGIN
--Don't deploy 2005 and above stuff
END
Я сделал нечто подобное для другой проблемы.
http://sankarreddy.com/2010/05/database-internal-version-create-version-and-current-version/