使用where子句筛选存储过程的结果集

时间:2009-07-29 15:45:16

标签: sql-server tsql

我正在寻找过滤存储过程的结果集。我想要的是以下(非工作)语法:

IF EXISTS ( SELECT 1 FROM  (EXEC  sp_linkedservers) WHERE srv_name = 'myServer' )
    PRINT N'dropping linked servers'
GO

编辑 - 这只是一个例子,如果可能,我想要一个通用的解决方案

4 个答案:

答案 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)

将存储过程移动到表值用户定义函数。保留现有的存储过程,但只是让它调用这个新函数而不是复制逻辑。然后在查询中使用该函数。