EMP_2
テーブルに列を追加したい。新しいEMP_PCT
列には、パーセンテージが数値として、たとえば。として格納20%
され20.0
ます。
このメソッドを入力してみました。ALTER TABLE
しかし、ステートメントに構文エラーがありました。
なぜ機能しないのですか?以下は私が使用しているSQLです。
ALTER TABLE EMP_2
ADD EMP_PCT NUMBER(4,2);
EMP_2
テーブルに列を追加したい。新しいEMP_PCT
列には、パーセンテージが数値として、たとえば。として格納20%
され20.0
ます。
このメソッドを入力してみました。ALTER TABLE
しかし、ステートメントに構文エラーがありました。
なぜ機能しないのですか?以下は私が使用しているSQLです。
ALTER TABLE EMP_2
ADD EMP_PCT NUMBER(4,2);
アクセスDDLデータ型名は、分類が難しい場合があります。 NUMBER
実際には、倍精度浮動小数点数としてフィールドを作成します。ただし、フィールドサイズ、精度、またはスケールを括弧の後NUMBER
に含めようとすると、構文エラーが発生します。次のステートメントは、ADOまたはDAOのどちらから実行する場合でも、doubleフィールドを作成します。
ALTER TABLE MyTable ADD COLUMN EMP_PCT NUMBER;
次のステートメントは、小数点MyTable
の左側に最大2桁、右側に最大2桁を保持することを意味する、精度=4およびスケール=2の10進数データ型列をに追加します。
CurrentProject.Connection.Execute "ALTER TABLE MyTable ADD COLUMN EMP_PCT DECIMAL (4,2);"
CurrentProject.Connection
DDLステートメントはADOオブジェクトであるため、以前は実行していました。AccessSQLでは、ADOを使用して10進フィールドしか作成できません。このステートメントをDAOから実行しようとすると、Accessクエリデザイナを使用しCurrentDb.Execute
たり、Accessクエリデザイナから実行したりすると、構文エラーが発生します。詳細については、フィールドタイプリファレンス-DDL、DAO、およびADOXの名前と値を参照してください。
@ErikEが説明したように、Accessの10進型は、特に使用しているAccess2003では問題があります。代わりに通貨タイプフィールドを使用できるかどうかを検討してください。これは、小数点以下のバグを回避し、dbエンジンが固定小数点以下の桁数を処理する方法により、より高速なパフォーマンスを提供します。
まず、Decimal
Access 2003ではデータ型を使用しないことをお勧めします。これは、並べ替え(順序が間違っている)と集計(小数部分の合計)に関するバグがあるためです。Access 2007では、集計の問題は解決されますが、並べ替えは解決されません(ただし、Access 2007では、列にインデックスを付けることでこれを修正できると思われます)。
スクリプトに関しては、2つの明らかな問題があります。
使用してはいけADD COLUMN ColumnName
ませんADD ColumnName
正しいデータ型はですDECIMAL
。これNUMBER
は、代わりに倍精度浮動小数点を作成し、任意の種類のサイズを指定した後に括弧を使用できないためです。(たぶん NUMERIC
の同義語として機能するでしょうDECIMAL
が、私にはわかりません。)
だからこれはあなたのために働くはずです:
ALTER TABLE EMP_2 ADD COLUMN EMP_PCT DECIMAL(4,2);
HansUpおよびその他のソースによると、これは(のように)DAOを介して送信することはできませんが、CurrentDb.Execute
ADO(CurrentProject.Connection.Execute
)を介して送信する必要があります。
どうやら、このSQLを機能させる方法はありますが、データベース設定を変更する必要があります。
10進データ型は、デフォルトのJet4.0mdbファイルではサポートされていません。SQLウィンドウで10進データ型を使用するには、SQL Server互換性構文(ANSI 92)設定を使用する必要があります。
メニューの[ツール]>[オプション]をクリックします。[テーブル/クエリ]タブをクリックします。SQL Server互換性構文(ANSI 92)セクションの[このデータベース]のチェックボックスをオンにします。このモードは、ワイルドカードを使用したクエリを含むデータベース全体に影響するため、データベースのコピーでこれを試してみることをお勧めします。
それでも問題が解決しない場合は、次の方法を検討してください(Philippe Grondierのおかげで)。
Dim TD As DAO.TableDef
Dim F As DAO.Field
Set TD = CurrentDb.TableDefs("TableName")
Set F = TD.CreateField("FieldName", dbDecimal, 4)
F.DecimalPlaces = 2
F.DefaultValue = 0
TD.Fields.Append F
参考までに、関連するMicrosoft.comのヘルプページを次に示します。
これを試して
ALTER TABLE EMP_2 ADD (EMP_PCT NUMBER (4,2));