Фильтрация результирующего набора хранимого процесса с помощью предложения where - PullRequest
3 голосов
/ 29 июля 2009

Я хочу отфильтровать набор результатов хранимой процедуры. Я хотел бы что-то вроде следующего (нерабочего) синтаксиса:

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

edit - это всего лишь один пример, я хотел бы общее решение, если это возможно

Ответы [ 4 ]

12 голосов
/ 29 июля 2009

Вы можете поместить результаты хранимой процедуры во временную таблицу или табличную переменную перед этим, а затем выполнить запрос к этой таблице, применив любое условие 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 на то, что вы хотите фильтровать.

3 голосов
/ 29 июля 2009

попробуйте это:

-- 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
1 голос
/ 29 июля 2009

Предполагая, что вы хотите именно для цели, изложенной в вашем вопросе, а не для общего решения, вы можете просто запросить sys.servers (SQL 2005+) (или sysservers до 2005), не нужно использовать хранимую процедуру 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
0 голосов
/ 29 июля 2009

Переместить хранимую процедуру в табличную пользовательскую функцию. Сохраните существующую хранимую процедуру, но просто вызовите эту новую функцию, а не дублируйте логику. Затем используйте функцию в вашем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...