0

ストアド プロシージャSELECTのステートメントから特定の列を取得しようとすると問題が発生します。EXECストアドプロシージャが返すを見つけようとしていますCOUNT(*)が、これは私が正常に行っています:

INSERT INTO #temp
EXEC dbo.my_sp
SET @count = (SELECT COUNT(*) FROM #temp)
DELETE FROM #temp

ただし、これは、返された列がテーブル列と明確に一致する場合にのみ機能し、多くの異なるストアド プロシージャ (それぞれが異なる列を返す) の数を見つけようとしているため、それぞれに新しいテーブルを作成せずにこのメソッドを使用することはできません。ストアド プロシージャ。

SELECTから列を特定する方法はありEXEC dbo.my_spますか?

4

2 に答える 2

3

ローカル インスタンスへのループバック リンク サーバーを作成し、データ アクセスが有効になっていることを確認します。という名前のローカル インスタンスがあるとしますYourServer\SQL2008

USE [master];
GO
EXEC sp_addlinkedserver 
  @server     = N'LoopbackLocal', 
  @srvproduct = N'',
  @provider   = N'SQLNCLI', 
  @datasrc    = N'.\SQL2008', 
  @catalog    = N'tempdb';
GO

EXEC sp_serveroption 
  @server   = N'LoopbackLocal', 
  @optname  = N'collation compatible', 
  @optvalue = N'true';
GO

EXEC sp_serveroption 
  @server   = N'LoopbackLocal', 
  @optname  = N'data access', 
  @optvalue = N'true';
GO

EXEC sp_addlinkedsrvlogin 
  @rmtsrvname = N'LoopbackLocal', 
  @locallogin = NULL , 
  @useself    = N'True';
GO
-- you may need to configure other security here

その後OPENQUERY、アドホック クエリであるかのようにストアド プロシージャを実行するために使用できます。

SELECT COUNT(*)
  FROM OPENQUERY
  (
    LoopbackLocal, 
    'EXEC dbo.my_sp'
  ) AS y;

ここで、dbo.my_sp情報を最初に #temp テーブルにダンプすると、問題が発生します。これは、OPENQUERY処理できるコードのブロックではなくなるためです。たとえば、sp_who2少なくとも SQL Server 2012 でこの方法を実行しようとすると、使用するように変更されたエラーが発生sp_describe_first_result_setOPENQUERYます (したがって、これでうまくいくかもしれません。テストする 2008 はありませんが、いつか問題になるでしょう):

メッセージ 11526、レベル 16、状態 1、プロシージャ sp_describe_first_result_set、行 1
... が一時テーブルを使用しているため、メタデータを特定できませんでした。

ただし、これを頻繁に行う場合は、特殊なストアド プロシージャを作成 (またはこれらのストアド プロシージャにオプションを追加) して、カウントのみが返されるようにしてみませんか?

于 2013-07-25T16:05:44.803 に答える