2009-07-29 82 views
3

我正在寻找筛选存储过程的结果集。我想是类似如下(非工作)语法:使用Where子句筛选存储过程的结果集

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

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

回答

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 
+0

那么为什么这是downvoted当它是唯一的方式在sql服务器,你可以做到你想要的? – 2009-07-29 16:03:30

+0

没有冒犯,这很聪明,但有几个原因 - openquery可能是一个安全问题,所以在许多系统上它被关闭;做一个链接服务器对于这个问题是矫枉过正的;恕我直言,你正在使用链接服务器的“副作用”和openquery,其他人不希望看到 – onupdatecascade 2009-08-02 06:04:15

+1

是完全正确的。我认为OP有一种情况,他并不总是知道存储过程的确切输出。如果你确实知道那么首先声明表并从sproc插入是一个很好的解决方案。如果不是,那么我的建议是唯一可行的方法。 – 2009-08-02 12:54:34

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子句你想过滤的内容。

0

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

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 
相关问题