使用 WMI 查找有关安装的 SQL Server 版本的信息。这种方法也存在各种可能的失败问题。但比注册表解决方案要好得多。
如果注册表项因任何原因遭到破坏,我已寻找替代解决方案作为备用解决方案。
获取WmiNameSpace
获取 SQL Server 节点下可用的命名空间列表。限定您希望返回到 GetSqlServerValidationResults 以获取更多信息的命名空间
GetSqlServerValidationResults
实际版本检查功能。我非常有兴趣获得一个名称值对以避免函数中的 if 条件膨胀。由于时间限制,无法分配更多时间来更改名称值列表。
您可能需要更改数字以检查您要比较的版本
function GetWmiNameSpace(): String;
var
oWMI, oServer, oProvider, oInstances, collSubNamespaces: Variant;
i: Integer;
item: Variant;
begin
oWMI := CreateOleObject('wbemScripting.SWbemLocator');
oServer := oWMI.ConnectServer('.', 'root/Microsoft/sqlserver');
collSubNamespaces := oServer.ExecQuery('select * from __namespace');
for i := 0 to collSubNamespaces.Count - 1 do
begin
item := collSubNamespaces.ItemIndex[i];
if Pos('ComputerManagement', item.Name) = 1 then Result := item.Name;
Log('Namespaces are ' + item.Name);
end;
end;
function GetSqlServerValidationResults(): String;
var
Query: string;
WbemLocator, WbemServices, WbemObjectSet: Variant;
server: Variant;
I: Integer;
versions: TStringList;
begin
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemServices :=
WbemLocator.ConnectServer(
'.', 'root\Microsoft\SqlServer\' + GetWmiNameSpace());
Query := 'SELECT * FROM SqlServiceAdvancedProperty';
WbemObjectSet := WbemServices.ExecQuery(Query);
if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
begin
for I := 0 to WbemObjectSet.Count - 1 do
begin
server := WbemObjectSet.ItemIndex(I);
if not VarIsNull(server) then
begin
if server.PropertyName = 'VERSION' then
begin
Log('Name' + server.PropertyName);
if not VarIsNull(server.PropertyStrValue) then
begin
Log('value ==> ' + server.PropertyStrValue + '[' +
IntToStr(pos('13.0.',server.PropertyStrValue)));
if pos('10.0.', server.PropertyStrValue) = 1 then Result := '2008';
if pos('10.5', server.PropertyStrValue) = 1 then Result := '2008R2';
if pos('11.0.', server.PropertyStrValue) = 1 then Result := '2012';
if pos('12.0.', server.PropertyStrValue) = 1 then Result := '2014';
if pos('13.0.', server.PropertyStrValue) = 1 then Result := '2016';
end;
end;
end;
end;
end;
end;