代码之家  ›  专栏  ›  技术社区  ›  Scott Weinstein

使用WHERE子句筛选存储过程的结果集

  •  3
  • Scott Weinstein  · 技术社区  · 15 年前

    我正在筛选存储过程的结果集。我想要以下(非工作)语法:

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

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

    4 回复  |  直到 15 年前
        1
  •  3
  •   Mladen Prajdic    15 年前

    试试这个:

    -- 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
    
        2
  •  12
  •   Mallioch    15 年前

    在此之前,可以将存储过程的结果放入临时表或表变量中,然后查询该表,并对该表应用所需的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
  •  1
  •   AdaTheDev    15 年前

    假设您希望它用于问题中概述的确切目的,而不是一般的解决方案,那么您可以只查询sys.servers(SQL 2005+)(或sys servers pre 2005),无需使用sp ou 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
    
        4
  •  0
  •   Joel Coehoorn    15 年前

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