我正在寻找筛选存储过程的结果集。我想是类似如下(非工作)语法:使用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