我正在寻找过滤存储过程的结果集。我想要的是以下(非工作)语法:
IF EXISTS ( SELECT 1 FROM (EXEC sp_linkedservers) WHERE srv_name = 'myServer' )
PRINT N'dropping linked servers'
GO
编辑 - 这只是一个例子,如果可能,我想要一个通用的解决方案
答案 0 :(得分:12)
您可以在此之前将存储过程的结果放入临时表或表变量中,然后查询该表,将任何where子句应用于您想要的内容。
<强> [编辑] 强>
像这样:
DECLARE @foo TABLE
(
SRV_NAME NVARCHAR(100),
SRV_PROVIDERNAME NVARCHAR(100),
SRV_PRODUCT NVARCHAR(100),
SRV_DATASOURCE NVARCHAR(100),
SRV_PROVIDERSTRING NVARCHAR(100),
SRV_LOCATION NVARCHAR(100),
SRV_CAT NVARCHAR(100)
)
INSERT INTO @foo
EXEC sp_linkedservers
SELECT * FROM @foo WHERE SRV_PRODUCT = 'SQL Server'
当然,您可以将最终的where子句更改为您想要过滤的内容。
答案 1 :(得分:3)
试试这个:
-- add 'loopback' linkedserver
if exists (select * from master..sysservers where srvname = 'loopback')
exec sp_dropserver 'loopback'
go
exec sp_addlinkedserver @server = N'loopback',
@srvproduct = N'',
@provider = N'SQLOLEDB',
@datasrc = @@servername
go
select * into #t from openquery(loopback, 'set fmtonly on exec sp_who')
select * from #t
drop table #t
go
答案 2 :(得分:1)
假设您希望将其用于问题中列出的确切目的,而不是一般解决方案,那么您可以只查询sys.servers(SQL 2005+)(或2005之前的sysservers),无需使用sp_linkedservers存储过程:
-- SQL 2005+
IF EXISTS ( SELECT 1 FROM sys.servers WHERE name = 'myServer' )
PRINT N'dropping linked servers'
GO
-- SQL 2000
IF EXISTS ( SELECT 1 FROM sysservers WHERE srvname = 'myServer' )
PRINT N'dropping linked servers'
GO
答案 3 :(得分:0)
将存储过程移动到表值用户定义函数。保留现有的存储过程,但只是让它调用这个新函数而不是复制逻辑。然后在查询中使用该函数。