我正在尋找篩選存儲過程的結果集。我想是類似如下(非工作)語法:使用Where子句篩選存儲過程的結果集
IF EXISTS (SELECT 1 FROM (EXEC sp_linkedservers) WHERE srv_name = 'myServer')
PRINT N'dropping linked servers'
GO
編輯 - 這只是一個例子,我想一般的解決方案,如果可能的
我正在尋找篩選存儲過程的結果集。我想是類似如下(非工作)語法:使用Where子句篩選存儲過程的結果集
IF EXISTS (SELECT 1 FROM (EXEC sp_linkedservers) WHERE srv_name = 'myServer')
PRINT N'dropping linked servers'
GO
編輯 - 這只是一個例子,我想一般的解決方案,如果可能的
試試這個:
-- 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
您可以在存儲過程的結果存入臨時表或表變量之前,然後查詢該表,將任何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子句你想過濾的內容。
將存儲過程移動到一個表值用戶定義的函數。保留現有的存儲過程,只是讓它調用這個新函數而不是重複邏輯。然後在查詢中使用該函數。
假設你想要它的目的是在你的問題中概括的確切目的,而不是一個通用的解決方案,那麼你可以查詢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
那麼爲什麼這是downvoted當它是唯一的方式在sql服務器,你可以做到你想要的? – 2009-07-29 16:03:30
沒有冒犯,這很聰明,但有幾個原因 - openquery可能是一個安全問題,所以在許多系統上它被關閉;做一個鏈接服務器對於這個問題是矯枉過正的;恕我直言,你正在使用鏈接服務器的「副作用」和openquery,其他人不希望看到 – onupdatecascade 2009-08-02 06:04:15
是完全正確的。我認爲OP有一種情況,他並不總是知道存儲過程的確切輸出。如果你確實知道那麼首先聲明表並從sproc插入是一個很好的解決方案。如果不是,那麼我的建議是唯一可行的方法。 – 2009-08-02 12:54:34