レコードごと/ForEachRecord データ ブロック内でいくつかのデータ ブロックやデータ アクションを使用することができるのだけど、例えばレコードの編集/EditRecord データブロックを使用した場合、参照されているすべてのレコードに対しフィールドの編集を行うことができる。レコードの削除/DeleteRecord アクションを使用した場合、すべてのレコードを削除することになる。当然 If プログラム フローなどでフィールドの値を判定しながら処理することもできる。
レコードごと データブロックが終了するのは、
- 最後のレコードについての処理が終了した時
- エラーの生成/RaiseError アクションが実行された時
- マクロの中止/StopMacro アクションが実行された時
- レコードごとに終了/ExitForEachRecord アクションが実行された時
なお、レコードごと データ ブロックで参照するレコードが 0レコードであった場合は、ブロック内のアクションはすべて実行されない。
以下、サンプルでFizz Buzzをデータマクロで実行してみる。
非常にシンプルなテーブルを用意。 |
こんな感じで 30レコードほど |
レコードごと データ ブロックで参照するレコードの順番に厳密さが必要である場合、ソートを設定したクエリを使用する。
SQL Azure 上ではストアド プロシージャになっているが、概ねどのような動作になっているのかは、
- @@TRANCOUNT > 0 である時、SAVE TRANSACTION
- @@TRANCOUNT = 0 である時、BEGIN TRANSACTION
- レコードごと データ ブロックに相応する部分のトランザクションの分離レベルは、SERIALIZABLE
- テーブルやPKを含むクエリを参照する場合、PKの"ID"で昇順ソート
- @@FETCH_STATUS = 0 である間、カーソルをフェッチ
- WHILEを抜けたら、トランザクション分離レベルは、READ COMMITTED
- BEGIN TRANSACTION している場合、COMMIT
t_FizzBuzz [t1].[ID] Mod 3=0 rtnFizzBuzz "Fizz" [t1].[ID] Mod 5=0 rtnFizzBuzz Concat([rtnFizzBuzz],"Buzz") t1.FizzBuzz Coalesce([rtnFizzBuzz],Format([t1].[ID],'0')) rtnFizzBuzz Null
0 件のコメント:
コメントを投稿