Sql server 通过链接服务器列出有关SQL Server的信息

Sql server 通过链接服务器列出有关SQL Server的信息,sql-server,tsql,linked-server,Sql Server,Tsql,Linked Server,我使用SERVERPROPERTY通过链接服务器从其他实例中查找信息。不幸的是,SERVERPROPERTY与我现在运行查询的服务器相关 你能帮我吗 查询: declare @instance_name nvarchar(50) declare @command nvarchar(max) declare instance_name_cursor cursor for select name from msdb.sys.servers where produc

我使用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;
然后,它只是一个在光标内开槽的例子