2009-06-01 14 views
1

基本的に私のストアドプロシージャでは、テーブルのリストを返すこと、変数にこのリストを格納することです。私はこのストアドプロシージャを再帰的に呼び出すために、リスト内のすべての項目を調べる必要があります。最後に、私はこの再帰を構築した全体的なlistOfTablesが必要です。 何か助けがあれば幸いです再帰的ストアドプロシージャを書く

+1

クエリや出力の例を提供できますか? – Jeremy

答えて

2

あなたはSQL2005以上を使用している場合(特定の状況で役立つかどうかは不明ですが、ほとんどの再帰的なクエリの重要な代替手段)には、Common Table Expressionsをご覧ください。再帰的な手続きでは、32レベル以上の深さをネストすることはできず、あまりエレガントではありません。

2

あなたはCTE年代を使用することができます。

WITH q (column1, column2) (
     SELECT * 
     FROM table 
     UNION ALL 
     SELECT * 
     FROM table 
     JOIN q 
     ON  … 
     ) 
SELECT * 
FROM  q 

はしかし、異なる制限があります:あなたは

0

あなたは再帰または貫通ちょうどループの後にある集計、分析機能、TOP句などを使用することはできませんすべてのテーブル?あなたがあなたのSPでテーブル変数を使用することができ、すべてのテーブルをループするようにSQL Server 2005を使用したい場合は、thse線に沿って何かを試してみてください。

declare @TableList as table (
    ID int identity (1,1), 
    TableName varchar(500) 
) 

insert into @TableList (TableName) 
select name 
from sys.tables 

declare @count int 
declare @limit int 
declare @TableName varchar(500) 

set @count = 1 
select @limit = max(ID) from @TableList 

while @count <= @limit 
    begin 
     select @TableName = TableName from @TableList where ID = @count 
     print @TableName --replace with call to SP 

     set @count = @count + 1 
    end 

はSPを呼び出してprint @TableNameを交換し、そしてあなたの場合これをDB内のすべてのテーブルで実行しないようにしてから、クエリselect name from sys.tablesを変更して、後のテーブルのみを返すようにしてください。

0

ほとんどの場合、

クエリではなくストアドプロシージャを使用する必要がある場合は、テーブルリストを反復処理するだけで、選択したコードを使用してテーブルリストを反復し、プロシージャを呼び出すことができます。 Macrosはすでに私がLOLをタイプしているときにそれを行う方法を投稿しました。また、Mehrdadがすでに述べたように、SQL Serverの呼び出し可能な入れ子レベルの数には限界があり、かなり浅いです。私は、再帰呼び出しが必要であるというあなたの説明から確信していません。リストの単純な反復のように見えますが、本当に再帰が必要な場合は、CS 101クラスを覚えておいてください。any recursive algorithm can be transformed into a non-recursive one by using a loop iteration and a stack

+0

両刃の剣です。無限ループを得ることができます。無限再帰を持つことはできません。 –

-3

ストアドプロシージャは非常に便利です。しかし。

私は最近、ストアドプロシージャに大きく依存していたシステムで作業しなければなりませんでした。それは悪夢だった。ビジネスロジックの半分が1つの言語(この場合はJava)にあり、残りの半分はストアドプロシージャのデータベースにありました。さらに悪いことに、アプリケーションの半分はソースコード管理の下にあり、残りの半分は永遠に失われたという1つのデータベースクラッシュです(悪いバックアッププロセス)。さらに、私がスキャン、分析、およびソースコードを管理するために持っている素敵な小さなツールは、データベース内のソースでは機能しません。

私は本質的にアンチストアドプロシージャではありませんが、どのように悪用される可能性がありますか?ストアドプロシージャは、多数のソースからのデータに対してルールを適用する必要がある場合に優れており、Webサーバー(およびDBMSサーバー)からの大量のレコードアクセスをオフロードするための優れた方法はありません。しかし、ほとんどの場合、私はむしろ、ビジネスロジックのためのストアドプロシージャとアプリケーションプログラミング言語よりもビューを使用したいと思います。私はいくつかのことをもう少し複雑にしていることは分かっています。しかし、それは人生をずっと簡単にすることができます。