第一个查询检索已安装实例的列表:
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
总而言之,我想将第一个查询中的结果实例提供给第二个查询,以便返回所有已安装实例的所有值。可能只有一个默认实例,但也可能有几个。
答案 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,我们需要两件事。
链接服务器的概念非常简单。基本上,它们允许通过t-sql在服务器之间进行通信。
要设置链接服务器Microsoft has documentation here,但基本上,在ssms中,右键单击Server Objects > New > Linked Server
,然后按照所有步骤设置sql server链接服务器。
然后热潮。您现在有一个链接服务器。
动态sql很酷且很有用,在这种情况下可以提供帮助。
通常,我们如何在链接服务器上执行存储过程是这样的:
exec [RemoteServer].DatabaseName.Schema.StoredProcedureName
但是,在我们的案例中,我们在撰写时并不知道[RemoteServer]
是什么。所以我们能做的就是编写一些Dynamic sql。使用动态sql,我们可以做的是在我们的db上执行一个tsql字符串,所以我们可以做类似的事情
exec(@Server + '.DatabaseName.Schema.StoredProcedureName')
并在远程服务器上运行proc。