在每个SQL Server实例上运行查询

时间:2016-06-28 15:23:39

标签: sql-server tsql

第一个查询检索已安装实例的列表:

SET NOCOUNT ON
DECLARE @GetInstances TABLE
     ( Value nvarchar(100),
     InstanceNames nvarchar(100),
     Data nvarchar(100))
Insert into @GetInstances
EXECUTE xp_regread
     @rootkey = 'HKEY_LOCAL_MACHINE',
     @key = 'SOFTWARE\Microsoft\Microsoft SQL Server',
     @value_name = 'InstalledInstances'
Select 
     InstanceNames 
From 
     @GetInstances
SET NOCOUNT OFF

第二个查询可能是任何东西,但为了争论,这个人会做;它检索每个跟踪实例的跟踪ID列表:

    select distinct 
         info.eventid 
    from 
         sys.traces as tr 
    cross apply sys.fn_trace_geteventinfo (tr.id) as info

总而言之,我想将第一个查询中的结果实例提供给第二个查询,以便返回所有已安装实例的所有值。可能只有一个默认实例,但也可能有几个。

1 个答案:

答案 0 :(得分:0)

听起来你可以使用光标。

注意:游标有点慢,通常你想把它们保持在最低限度。

查看this链接,深入了解它们。

但简而言之:他们可以让你循环遍历结果集并执行每行tsql

您的代码:

declare @GetInstances table
     ( 
        Value nvarchar(100),
        InstanceNames nvarchar(100),
        Data nvarchar(100)
    )
insert into @GetInstances
exec xp_regread
     @rootkey = 'HKEY_LOCAL_MACHINE',
     @key = 'SOFTWARE\Microsoft\Microsoft SQL Server',
     @value_name = 'InstalledInstances'


declare @Cursor as cursor;
declare @Server varchar(50);

set @Cursor = cursor for
select 
     InstanceNames
from 
     @GetInstances


open @Cursor;
fetch next from @Cursor into @Server;

while @@fetch_status = 0
begin
 print @Server
 fetch next from @Cursor into @Server;
END

close @Cursor;
deallocate @Cursor;

编辑

要使用此服务器名称执行proc,我们需要两件事。

  1. 我们需要确保将服务器设置为链接服务器
  2. 我们需要编写一小部分动态SQL(这很简单,不用担心)
  3. 链接服务器

    链接服务器的概念非常简单。基本上,它们允许通过t-sql在服务器之间进行通信。

    要设置链接服务器Microsoft has documentation here,但基本上,在ssms中,右键单击Server Objects > New > Linked Server,然后按照所有步骤设置sql server链接服务器。

    然后热潮。您现在有一个链接服务器。

    动态sql

    动态sql很酷且很有用,在这种情况下可以提供帮助。

    通常,我们如何在链接服务器上执行存储过程是这样的:

    exec [RemoteServer].DatabaseName.Schema.StoredProcedureName
    

    但是,在我们的案例中,我们在撰写时并不知道[RemoteServer]是什么。所以我们能做的就是编写一些Dynamic sql。使用动态sql,我们可以做的是在我们的db上执行一个tsql字符串,所以我们可以做类似的事情

    exec(@Server + '.DatabaseName.Schema.StoredProcedureName')
    

    并在远程服务器上运行proc。