2009-06-03 17 views
2

WHERE句にストアドプロシージャの呼び出しでSELECTを行う必要があります。 それはSQL Server 2005:WHERE句からストアドプロシージャを呼び出す

個別のトップ10 IXを選択....そのような何かである必要があり、v_droit dから をd.droit、v_info私 WHERE d.nomdroit = 'Y-Y' とi.id <> 2 と(任意のアイデア ... <> 3)(execがup_droits(IX、d.droit)から

をヴァルを選択しかし、それは動作しません?

が機能してストアドプロシージャを置き換えるために言ってはいけません関数内で既存のコードを使用することはできないため、関数は有効なオプションではありません。ストアドプロシージャを使用できるようにする必要があります

+1

あなたが話している特定のSQLサーバーに関する質問(タイトル、説明、タグ)を更新してください。これに関しては大きな違いがあります。 – bignose

+0

WITHではなくWHEREであることを意味しているとします(質問の本文に記載されています)。 –

+0

ストアドプロシージャは何をしますか? –

答えて

6

これは、最初のテーブルに対してクエリを実行し、その後、#TEMPテーブルまたは@tabel変数に出力をキャプチャする、ストアドプロシージャを実行することによって達成されます。このような何か:もちろん

declare @droits_table (val ,...); 
insert into @droits_table 
exec up_droits(param, param); 
SELECT distinct top 10 i.x, d.droit FROM v_droit d, v_info i WHERE d.nomdroit='yy' AND i.id<>2 AND (select val from @droits) <>3 

up_droitsは、クエリからi.xとd.droitパラメータを必要とするので、これはあなたのために動作しません。これは、ストアドプロシージャがおそらくビューまたはテーブル値関数である必要があることを示します。

1

できません。 WHERE句の内容はsearch expressionでなければなりません。

0

コードが一部のデータを変更するために関数として機能しないのはなぜですか?そうであれば、あなたは不運になります。where句で使用される関数は不変でなければなりません。

ストアドプロシージャでデータが変更されない場合は、関数内でラップすることができます。

+0

いいえ、データは変更されませんが、sp_executesqlを使用して実行する必要があるため、動的に構築されたクエリを実行する必要があります。 また、このストアドプロシージャは、3つの出力パラメータを持つ別のストアドプロシージャを呼び出します – Roxana

0

あなたがSQL Serverを使用している場合は、あなたが提案したことを行うことはできないと思います。

しかし、動的クエリーを作成することができますが、多くの興味深い問題が発生するため、注意してください。

EXEC @<query>

しかし、あなたはあなたのために、おそらくはるかに優れている、行うことができますanotherthing、あなたが#tableに選択した場合up_droitsは、一時テーブルでの結果を出すに機能することです:

構文は次のとおりです。あなたの関数/プロシージャの範囲の期間


declare procedure up_droits() as 
select val .. into #temp 

だから何を行うことは手続きに


create procedure Top10FromDroit 
begin 
    exec up_droits 
    SELECT distinct top 10 i.x, d.droit FROM v_droit d, v_info i WHERE d.nomdroit='yy' AND i.id2 AND (select val from (#temp) 3 
を作成しているため、それは一時的なもの0

うまくいけば、それはあなたに達成したい結果を与えるでしょう。

最初にあなたが成功しない場合は

、その周りのコードはそれを テーブル値関数ではなく、ストアドプロシージャを作成し、申し訳ありません

4

を^^けど。

例:

Scalar - SELECT id, name FROM test WHERE id < (SELECT dbo.mytestfunction()) 
Table - SELECT id, name FROM test WHERE id = (SELECT col1 from dbo.mytestfunction()) 
0

誰でも、ストアドプロシージャ内で動的SQlを実行する理由を説明できますか。あなたが必要とする状況はほとんどありませんが、実際にはほとんどありません。実行文字列の99.9%(または999の1000)は、パラメータを持つ通常のSQL文として書き直すことができます。

selectまたはwhere句の中に関数を持つSelectsと同じです。

解決方法の手順ではなく、データセットについて考えるようにしてください。

+0

再帰的なツリートラバーサル。 –

+0

メタプログラミング:e。 g。 1つのテーブル内でselectが返すべきテーブルの名前とこのテーブルのカラムを、eとしてロジックをSQLに実装したいとします。 g。いくつかのアプリケーションが(動的な)結果セットにアクセスします。 – FrankPl

+0

@RiverCを使用すると、動的SQLは必要ありません。再帰的なCTEを使用できます。http://technet.microsoft.com/en-us/library/ms186243.aspx – FrankPl

関連する問題