2009-07-29 61 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 
相關問題