2011-02-10 9 views
2

IN節内でストアドプロシージャを呼び出すことはできますか?SQL ServerのIN句内でストアドプロシージャを呼び出しますか?

Select field0, field2 FROM Table 
WHERE field0 in (exec storedproc) 

ストアドプロシージャの理由は

+0

O.oしようとしてはどうですか? – DHN

+0

@Barry、 – solkim

+0

@DHNをフォーマットしていただきありがとうございます。エラーメッセージ "EXECの近くの構文が間違っています" – solkim

答えて

4

これを達成するには、OpenRowsetを使用する必要があります。その後、別のオプションをこれらの設定を変更することができない場合、コメントでマーティンで説明したように、

sp_configure 'Show Advanced Options', 1 
GO 
RECONFIGURE 
GO 
sp_configure 'Ad Hoc Distributed Queries', 1 
GO 
RECONFIGURE 
GO 

:この次のオプションを行うために

Select Field0, Field2 From Table 
Where Field0 in (
       SELECT Field0 FROM OPENROWSET('SQLNCLI', 
          'Server=SERVERNAME;Trusted_Connection=yes;', 
          'EXEC StoredProc') 
       ) 

は、サーバー上で有効にする必要がありますテンポラリテーブルを作成します。

一時テーブルの定義は正確にストアドプロシージャの結果と一致している必要があり、一時テーブルにストアドプロシージャの結果を挿入するには

declare @t table 
(
Field0 int, 
Field1 varchar(100) 
... 
) 

Insert Into @t 
Exec storedProcedure 

Select Field0, Field2 From Table 
Where Field0 in (
       SELECT Field0 FROM @t 
       ) 

+0

+1これはサーバーに新しい接続を開きます。 –

+0

@Martin - そうです、私はこれを行う他の方法については本当に考えることができませんか?テーブル・ファンクションを使用するだけでなく、OPが実際にSPを変更したくないという印象を受けます。 – codingbadger

+0

OPは中間テーブル変数とINSERT INTO @T EXEC storedprocを追加して、それを 'IN'節で使用することもできます。 –

2

ストアドプロシージャは、このような場合に使用することができないことの複雑さです。しかし、IN文の引数として正しいテーブル値関数を使用する可能性を検討する

+0

+1ストアドプロシージャをTVFにリファクタリングすると、私にとって最良の解決策が得られます。 –

2

ストアドプロシージャは使用できません。テーブルを返す関数を使用する必要があります。たとえば:

CREATE FUNCTION myFunction(@arg varchar(30)) 
RETURNS @myTable table(Value INT) 
AS 
BEGIN 
    insert into @myTable(Value) values (1)  
    RETURN 
END 

今、あなたはあなたのクエリの一部としての機能を実行することができますどのように

Select field0, field2 FROM Table 
WHERE field0 in (select Value from myFunction('arg')) 
関連する問題