通过链接服务器列出 SQL 个服务器的信息
List informations about SQL Servers through linked servers
我正在使用 SERVERPROPERTY
通过链接服务器从其他实例中查找信息。不幸的是 SERVERPROPERTY
与我现在 运行 查询的服务器有关。
你能帮帮我吗?
查询:
declare @instance_name nvarchar(50)
declare @command nvarchar(max)
declare instance_name_cursor cursor for
select name
from msdb.sys.servers
where product = 'SQL Server'
open instance_name_cursor
FETCH NEXT FROM instance_name_cursor INTO @instance_name
while @@FETCH_STATUS = 0
begin
select @command = 'declare @osversion nvarchar(50)
set @osversion = (select
case
when windows_release = ''10.0'' then ''Windows Server 2016''
when windows_release = ''6.3'' then ''Windows Server 2012 R2''
when windows_release = ''6.2'' then ''Windows Server 2012''
when windows_release = ''6.1'' then ''Windows Server 2008 R2''
when windows_release = ''6.0'' then ''Windows Server 2008''
end
from sys.dm_os_windows_info )
insert into mydatabase.dbo.sql_server_info
select SERVERPROPERTY (''MachineName''),SERVERPROPERTY (''ProductVersion''),
SERVERPROPERTY (''Edition''),SERVERPROPERTY (''ProductLevel''),
cpu_count,(physical_memory_kb /1024),
(select maximum FROM ['+@instance_name+'].master.sys.configurations
where configuration_id=1544),@osversion
from ['+@instance_name+'].master.sys.dm_os_sys_info'
exec (@command)
FETCH NEXT FROM instance_name_cursor INTO @instance_name
end
CLOSE instance_name_cursor
DEALLOCATE instance_name_cursor
您需要 运行 链接服务器上的 SERVERPROPERTY()
函数,您可以使用 OPENQUERY
来实现,举个简单的例子:
SELECT MachineName
FROM OPENQUERY([LinkedServer], 'SELECT MachineName = SERVERPROPERTY (''MachineName'')') x;
那么这只是稍微调整您的查询来处理这个问题的情况,因此删除演示术语的光标您可能会得到如下内容:
DECLARE @instance_name nvarchar(50) = 'LinkedServer';
DECLARE @command NVARCHAR(MAX);
DECLARE @commandBase NVARCHAR(MAX) =
'SELECT MachineName = SERVERPROPERTY (''''MachineName''''),
ProductVersion = SERVERPROPERTY (''''ProductVersion''''),
Edition = SERVERPROPERTY (''''Edition''''),
ProductLevel = SERVERPROPERTY (''''ProductLevel''''),
Maximum = (SELECT Maximum FROM master.sys.configurations WHERE configuration_id = 1544),
OSVersion = CASE
WHEN wi.windows_release =''''10.0'''' THEN ''''Windows Server 2016''''
WHEN wi.windows_release = ''''6.3'''' THEN ''''Windows Server 2012 R2''''
WHEN wi.windows_release = ''''6.2'''' THEN ''''Windows Server 2012''''
WHEN wi.windows_release = ''''6.1'''' THEN ''''Windows Server 2008 R2''''
WHEN wi.windows_release = ''''6.0'''' THEN ''''Windows Server 2008''''
END
FROM master.sys.dm_os_sys_info AS si
CROSS JOIN master.sys.dm_os_windows_info AS wi;';
SET @Command = CONCAT('SELECT * FROM OPENQUERY(', QUOTENAME(@instance_name), ', ''', @CommandBase, ''');');
INSERT mydatabase.dbo.sql_server_info (<Columns>)
EXECUTE sp_executesql @Command;
那么这只是将其插入光标内的情况。
我正在使用 SERVERPROPERTY
通过链接服务器从其他实例中查找信息。不幸的是 SERVERPROPERTY
与我现在 运行 查询的服务器有关。
你能帮帮我吗?
查询:
declare @instance_name nvarchar(50)
declare @command nvarchar(max)
declare instance_name_cursor cursor for
select name
from msdb.sys.servers
where product = 'SQL Server'
open instance_name_cursor
FETCH NEXT FROM instance_name_cursor INTO @instance_name
while @@FETCH_STATUS = 0
begin
select @command = 'declare @osversion nvarchar(50)
set @osversion = (select
case
when windows_release = ''10.0'' then ''Windows Server 2016''
when windows_release = ''6.3'' then ''Windows Server 2012 R2''
when windows_release = ''6.2'' then ''Windows Server 2012''
when windows_release = ''6.1'' then ''Windows Server 2008 R2''
when windows_release = ''6.0'' then ''Windows Server 2008''
end
from sys.dm_os_windows_info )
insert into mydatabase.dbo.sql_server_info
select SERVERPROPERTY (''MachineName''),SERVERPROPERTY (''ProductVersion''),
SERVERPROPERTY (''Edition''),SERVERPROPERTY (''ProductLevel''),
cpu_count,(physical_memory_kb /1024),
(select maximum FROM ['+@instance_name+'].master.sys.configurations
where configuration_id=1544),@osversion
from ['+@instance_name+'].master.sys.dm_os_sys_info'
exec (@command)
FETCH NEXT FROM instance_name_cursor INTO @instance_name
end
CLOSE instance_name_cursor
DEALLOCATE instance_name_cursor
您需要 运行 链接服务器上的 SERVERPROPERTY()
函数,您可以使用 OPENQUERY
来实现,举个简单的例子:
SELECT MachineName
FROM OPENQUERY([LinkedServer], 'SELECT MachineName = SERVERPROPERTY (''MachineName'')') x;
那么这只是稍微调整您的查询来处理这个问题的情况,因此删除演示术语的光标您可能会得到如下内容:
DECLARE @instance_name nvarchar(50) = 'LinkedServer';
DECLARE @command NVARCHAR(MAX);
DECLARE @commandBase NVARCHAR(MAX) =
'SELECT MachineName = SERVERPROPERTY (''''MachineName''''),
ProductVersion = SERVERPROPERTY (''''ProductVersion''''),
Edition = SERVERPROPERTY (''''Edition''''),
ProductLevel = SERVERPROPERTY (''''ProductLevel''''),
Maximum = (SELECT Maximum FROM master.sys.configurations WHERE configuration_id = 1544),
OSVersion = CASE
WHEN wi.windows_release =''''10.0'''' THEN ''''Windows Server 2016''''
WHEN wi.windows_release = ''''6.3'''' THEN ''''Windows Server 2012 R2''''
WHEN wi.windows_release = ''''6.2'''' THEN ''''Windows Server 2012''''
WHEN wi.windows_release = ''''6.1'''' THEN ''''Windows Server 2008 R2''''
WHEN wi.windows_release = ''''6.0'''' THEN ''''Windows Server 2008''''
END
FROM master.sys.dm_os_sys_info AS si
CROSS JOIN master.sys.dm_os_windows_info AS wi;';
SET @Command = CONCAT('SELECT * FROM OPENQUERY(', QUOTENAME(@instance_name), ', ''', @CommandBase, ''');');
INSERT mydatabase.dbo.sql_server_info (<Columns>)
EXECUTE sp_executesql @Command;
那么这只是将其插入光标内的情况。