Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 универсальный код для определения версии OS  [new]
dsfglih
Guest
Поскольку MS уже не будет ничего делать для старых версий SQL,
надо бы самим написать что-то типа:
declare @WinVer table ( [host_platform] [nvarchar](256) null,[host_distribution] [nvarchar](256) null,[host_release] decimal(4,1) null,[version] decimal(6,1) null )

-- select @@version;
if (CHARINDEX('Windows',@@VERSION)<>0) begin
	-- windows
	if (PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR),4)<=10) begin
		-- sql <= sql 2008
		if (CHARINDEX('Windows NT', @@version)<>0) begin
			-- windows <= win7 or win2008r2
			insert into @WinVer ([host_platform] ,[host_distribution] ,[host_release] ,[version])
			select [host_platform] = 'Windows'
				,[host_distribution] = 'Windows Server'
				,[host_release] = substring(@@version, patindex('%Windows NT%', @@version) + 11, 3)
				,[version] = case substring(@@version, patindex('%Windows NT%', @@version) + 11, 3)
									when '5.1' then 2000.
									when '5.2' then 2003.
									when '6.0' then 2008.
									when '6.1' then 2008.5
									when '6.2' then 2012.
									when '6.3' then 2012.5
									else -1
							end
		end else begin
			-- windows > win7 or win2008r2
			insert into @WinVer ([host_platform] ,[host_distribution] ,[host_release] ,[version])
			select [host_platform] = 'Windows'
				,[host_distribution] = 'Windows Server'
				,[host_release] = null
				,[version] = null
		end
	end else begin
		-- sql > sql 2008
		insert into @WinVer ([host_platform] ,[host_distribution] ,[host_release] ,[version])
		select [host_platform] = 'Windows'
			,[host_distribution] = 'Windows Server'
			,[host_release] = [windows_release]
			,[version] = case [windows_release]
							when '5.1' then 2000.
							when '5.2' then 2003.
							when '6.0' then 2008.
							when '6.1' then 2008.5
							when '6.2' then 2012.
							when '6.3' then 2012.5
							when '10.0' then 2016.
							else -1
						end
		from sys.dm_os_windows_info;
	end
end else begin
	-- linux
	insert into @WinVer ([host_platform] ,[host_distribution] ,[host_release] ,[version])
	select [host_platform] ,[host_distribution] ,[host_release] ,[version] = null
	from [master].[sys].[dm_os_host_info]
end

select * from @WinVer;

присоединяйтесь
29 авг 17, 22:22    [20757301]     Ответить | Цитировать Сообщить модератору
 Re: универсальный код для определения версии OS  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
что-то у вас с номерами версий не то
Operating System Version
29 авг 17, 22:46    [20757336]     Ответить | Цитировать Сообщить модератору
 Re: универсальный код для определения версии OS  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36693
Опуская за скобки ужасность приведенного копипастного кода, не могу понять, а зачем вообще это писать?...

Сообщение было отредактировано: 30 авг 17, 00:31
30 авг 17, 00:30    [20757446]     Ответить | Цитировать Сообщить модератору
 Re: универсальный код для определения версии OS  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7214
Гавриленко Сергей Алексеевич
Опуская за скобки ужасность приведенного копипастного кода, не могу понять, а зачем вообще это писать?...
ну как? бэкап Интернета на sql.ru.
30 авг 17, 00:45    [20757455]     Ответить | Цитировать Сообщить модератору
 Re: универсальный код для определения версии OS  [new]
dsfglih
Guest
Гавриленко Сергей Алексеевич,
не понял вопроса.

Если вопрос - зачем поддерживать старые версии? ... Тут и отвечать как-то странно.
Если вопрос - зачем нужна версия windows на t-sql, то перенапрявлю вопрос к ms - sys.dm_os_windows_info и sys.dm_os_host_info
30 авг 17, 01:50    [20757489]     Ответить | Цитировать Сообщить модератору
 Re: универсальный код для определения версии OS  [new]
dies irae
Member

Откуда:
Сообщений: 78
Гавриленко Сергей Алексеевич
Опуская за скобки ужасность приведенного копипастного кода...


ничего ужасного в приведённом коде нет
разве что квадратные скобки лишние, но это отнюдь не критично
30 авг 17, 17:14    [20759556]     Ответить | Цитировать Сообщить модератору
 Re: универсальный код для определения версии OS  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
dsfglih
Гавриленко Сергей Алексеевич,
не понял вопроса.

Если вопрос - зачем поддерживать старые версии? ... Тут и отвечать как-то странно.
Если вопрос - зачем нужна версия windows на t-sql, то перенапрявлю вопрос к ms - sys.dm_os_windows_info и sys.dm_os_host_info

Поддерживать старые версии, конечно, можно, но совершенно не обязательно. Более того желательно от них оказываться и мигрировать на новые.
"зачем нужна версия windows на t-sql" - действительно вопрос
Вместо изобретения велосипедов, лучше использовать стандартные средства xp_msver. Хотя в хелпе и написано, что начиная с 2008, только что проверил и в 2005 есть, и в 2000. Более старых версий сервера нету, извините.
31 авг 17, 08:24    [20760388]     Ответить | Цитировать Сообщить модератору
 Re: универсальный код для определения версии OS  [new]
dsfglih
Guest
Guf,
непонятно, что будет с xp_msver на linux

if exists ( select * from sys.objects where object_id = OBJECT_ID('[dbo].[fn_os]') and type in (N'FN', N'IF', N'TF', N'FS', N'FT') )
	drop function [dbo].[fn_os]
GO

create function [dbo].[fn_os]()
returns @info table ( [host_platform] [nvarchar](256) null,[host_distribution] [nvarchar](256) null,[host_release] decimal(4,1) null,[version] real null )
as begin
	if (CHARINDEX('Windows',@@VERSION)<>0) begin
		-- windows
		if (PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR),4)<=9) begin
			-- sql <= sql 2005
			if (CHARINDEX('Windows NT', @@version)<>0) begin
				-- windows < 2016
				insert into @info ([host_platform] ,[host_distribution] ,[host_release] ,[version])
				select [host_platform] = 'Windows'
					,[host_distribution] = 'Windows Server'
					,[host_release] = substring(@@version, patindex('%Windows NT%', @@version) + 11, 3)
					,[version] = CAST( (case substring(@@version, patindex('%Windows NT%', @@version) + 11, 3)
										when '5.0' then 2000.
										when '5.1' then 2003.1	-- Windows XP
										when '5.2' then 2003.
										when '6.0' then 2008.
										when '6.1' then 2008.5
										when '6.2' then 2012.
										when '6.3' then 2012.5
										-- when '10.0' then 2016. -- нет там Windows NT
										else -1
								end) as real)
			end else begin
				-- windows > 2016
				insert into @info ([host_platform] ,[host_distribution] ,[host_release] ,[version])
				select [host_platform] = 'Windows'
					,[host_distribution] = 'Windows Server'
					,[host_release] = '-ge 2016'
					,[version] = null
			end
		end else begin
			-- sql >= sql 2008
			if (PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR),4)>=14) begin
				insert into @info ([host_platform] ,[host_distribution] ,[host_release] ,[version])
				select [host_platform] ,[host_distribution] ,[host_release] ,[version] = null
				from sys.dm_os_host_info;
			end else begin
				insert into @info ([host_platform] ,[host_distribution] ,[host_release] ,[version])
				select [host_platform] = 'Windows'
					,[host_distribution] = 'Windows Server'
					,[host_release] = [windows_release]
					,[version] = CAST( (case [windows_release]
									when '5.0' then 2000.
									when '5.1' then 2003.1	-- Windows XP
									when '5.2' then 2003.
									when '6.0' then 2008.
									when '6.1' then 2008.5
									when '6.2' then 2012.
									when '6.3' then 2012.5
									when '10.0' then 2016.
									else -1.
								end) as real)
				from sys.dm_os_windows_info;
			end
		end
	end else begin
		-- linux
		insert into @info ([host_platform] ,[host_distribution] ,[host_release] ,[version])
		select [host_platform] ,[host_distribution] ,[host_release] ,[version] = null
		from sys.dm_os_host_info;
	end

	return;
end
GO

select * from [dbo].[fn_os]();

exec xp_msver;

host_platform	host_distribution	host_release	version
Linux		Oracle Linux Server	7.4		NULL

Index	Name	Internal_Value	Character_Value
1	ProductName	NULL	Microsoft SQL Server
2	ProductVersion	917504	14.0.900.75
3	Language	NULL	English
4	Platform	NULL	NT x64
5	Comments	NULL	SQL
6	CompanyName	NULL	Microsoft Corporation
7	FileDescription	NULL	SQL Server Windows NT - 64 Bit
8	FileVersion	NULL	2017.0140.0900.75 ((SQL_Main).170727-1527)
9	InternalName	NULL	SQLSERVR
10	LegalCopyright	NULL	Microsoft. All rights reserved.
11	LegalTrademarks	NULL	Microsoft SQL Server is a registered trademark of Microsoft Corporation.
12	OriginalFilename	NULL	SQLSERVR.EXE
13	PrivateBuild	NULL	NULL
14	SpecialBuild	58982475	NULL
15	WindowsVersion	58982475	6.2 (9200)
16	ProcessorCount	2	2
17	ProcessorActiveMask	NULL	               3
18	ProcessorType	8664	NULL
19	PhysicalMemory	2958	2958 (3101687808)
20	Product ID	NULL	NULL
31 авг 17, 19:48    [20762905]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить