ストアドプロシージャの結果セットをフィルタリングすることを検討しています。私がしたいことは、次の(非稼働)構文のようなものです: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'
。
どうすればいいですか? –
SQL 2000では、テーブル変数 – JNappi
の代わりに一時テーブルを使用する必要があり、結果セットのスキーマを宣言しないで実行する方法はありませんか? –
ストアドプロシージャをテーブル値のユーザー定義関数に移動します。既存のストアドプロシージャを保持しますが、ロジックを複製するのではなく、この新しい関数を呼び出すだけです。次に、クエリで関数を使用します。
これはシステムストアドプロシージャです。それを変更することはできません。 – onupdatecascade
また、ストアドプロシージャがテンポラリテーブルを使用する場合、これは機能しない可能性があります。ユーザー定義関数は一時表を使用できないためです。 – yucer
一般的な解決策ではなく、質問に記載されている正確な目的のために、sys.servers(SQL 2005+)(またはsysservers pre 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
これは、なぜこれがSQL Serverの唯一の方法である場合、あなたが望むものを正確に行うことができるのですか? –
賢明ではありませんが、いくつかの理由があります。オープンクエリはセキュリティ上の問題になる可能性があります。したがって、多くのシステムではスイッチがオフになっています。リンクされたサーバーを作ることは、この問題のために不当です。 IMHOあなたは完全に真である – onupdatecascade
を見ることを期待しない、リンクサーバーとオープンクェリーの「副作用」を使用しています。私はOPには、ストアドプロシージャの正確な出力を常に把握していない状況があると想定しています。あなたがそれを知っていれば、まず宣言テーブルを宣言し、sprocから挿入することは素晴らしい解決策です。そうでなければ、私の提案は唯一実行可能な方法です。 –