基本的に私のストアドプロシージャでは、テーブルのリストを返すこと、変数にこのリストを格納することです。私はこのストアドプロシージャを再帰的に呼び出すために、リスト内のすべての項目を調べる必要があります。最後に、私はこの再帰を構築した全体的なlistOfTablesが必要です。 何か助けがあれば幸いです再帰的ストアドプロシージャを書く
答えて
あなたはSQL2005以上を使用している場合(特定の状況で役立つかどうかは不明ですが、ほとんどの再帰的なクエリの重要な代替手段)には、Common Table Expressionsをご覧ください。再帰的な手続きでは、32レベル以上の深さをネストすることはできず、あまりエレガントではありません。
あなたはCTE
年代を使用することができます。
WITH q (column1, column2) (
SELECT *
FROM table
UNION ALL
SELECT *
FROM table
JOIN q
ON …
)
SELECT *
FROM q
はしかし、異なる制限があります:あなたは
あなたは再帰または貫通ちょうどループの後にある集計、分析機能、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
を変更して、後のテーブルのみを返すようにしてください。
ほとんどの場合、
クエリではなくストアドプロシージャを使用する必要がある場合は、テーブルリストを反復処理するだけで、選択したコードを使用してテーブルリストを反復し、プロシージャを呼び出すことができます。 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。
両刃の剣です。無限ループを得ることができます。無限再帰を持つことはできません。 –
ストアドプロシージャは非常に便利です。しかし。
私は最近、ストアドプロシージャに大きく依存していたシステムで作業しなければなりませんでした。それは悪夢だった。ビジネスロジックの半分が1つの言語(この場合はJava)にあり、残りの半分はストアドプロシージャのデータベースにありました。さらに悪いことに、アプリケーションの半分はソースコード管理の下にあり、残りの半分は永遠に失われたという1つのデータベースクラッシュです(悪いバックアッププロセス)。さらに、私がスキャン、分析、およびソースコードを管理するために持っている素敵な小さなツールは、データベース内のソースでは機能しません。
私は本質的にアンチストアドプロシージャではありませんが、どのように悪用される可能性がありますか?ストアドプロシージャは、多数のソースからのデータに対してルールを適用する必要がある場合に優れており、Webサーバー(およびDBMSサーバー)からの大量のレコードアクセスをオフロードするための優れた方法はありません。しかし、ほとんどの場合、私はむしろ、ビジネスロジックのためのストアドプロシージャとアプリケーションプログラミング言語よりもビューを使用したいと思います。私はいくつかのことをもう少し複雑にしていることは分かっています。しかし、それは人生をずっと簡単にすることができます。
- 1. Pythonで歩く再帰的な辞書
- 2. Blob ...非再帰的に書く方法
- 3. TXR:再帰的パターンマッチディレクティブを書き込む
- 4. 存在関数を再帰的に正しく書き込む
- 5. どのようにコードを再帰的に書くか?
- 6. 再帰的なXSLTコードを書くには
- 7. 再帰的なランダム変数を書く方が良い
- 8. Python - グローバル変数なしで再帰的に書く方法
- 9. Python辞書の再帰的な検索
- 10. ログの再帰的な辞書
- 11. 再帰的にはSQLサーバーでストアドプロシージャを2005
- 12. 再帰関数(私は再帰的にこの非再帰的なメソッドを書くことができますどのように)
- 13. 再帰的ループ
- 14. は再帰的
- 15. 再帰的
- 16. 再帰的
- 17. 再帰的メイズソルバメソッド
- 18. 再帰的エラーハンドラ
- 19. 再帰的レンダリングコンポーネント
- 20. 再帰的メニューシステム
- 21. 再帰的サイクル
- 22. 再帰的
- 23. 再帰的シーケンスジェネレータ
- 24. Java:より多くの再帰的メソッド
- 25. Oracleストアドプロシージャを書く
- 26. 再帰的メソッドを非再帰的Cに変換する
- 27. 回帰的再帰的メソッドのコールバック?
- 28. Javaで整数のArrayListを使用してコンビネーションを再帰的に書く
- 29. intの数字の合計を返す再帰的なメソッドを書くには?
- 30. 再帰を解く
クエリや出力の例を提供できますか? – Jeremy