テーブル変数に関する注意事項

AX2012では、X++でテーブル変数を複数のクエリで使いまわすと

AOSがクラッシュする場合がございます。

以下に問題が発生するプログラム例を用いて説明させて頂きます。

 

以下の例では、TestTable2というテーブル変数が2つのクエリで使用されています。

テーブル変数は、クエリを構成しているテーブル名を指定しているだけでなく、

データベースから取得した実際の値が格納されます。

このため、複数のクエリで同じテーブル変数を使用すると、予期せぬ問題が発生する可能性がございます。

 

(悪い例)

   TestTable1 TestTable1,TestTable1_2;

   TestTable2 TestTable2;

;

       while select TestTable1

           join TestTable2

           order by TestTable1.Field1, TestTable1.Field2

           where TestTable2.Field21 == TestTable1.Field1

       {

           select sum(IntField1) from TestTable1_2

               where TestTable1_2.Field2 == TestTable1.Field2

               join TestTable2

               where TestTable2.Field21 == TestTable1_2.Field1

 

各クエリで使用するテーブル変数を、それぞれのクエリ用に別々に宣言して頂くことで

上記のような問題を回避することが可能です。

 

(修正例)

   TestTable1 TestTable1,TestTable1_2;

   TestTable2 TestTable2,TestTable2_2;

;

       while select TestTable1

           join TestTable2

           order by TestTable1.Field1, TestTable1.Field2

           where TestTable2.Field21 == TestTable1.Field1

       {

           select sum(IntField1) from TestTable1_2

               where TestTable1_2.Field2 == TestTable1.Field2

               join TestTable2_2

               where TestTable2_2.Field21 == TestTable1_2.Field1