Ошибка добавления столбца с помощью команды SQL в MS Access 2003

Я хочу добавить столбец в таблицу EMP_2 . Новый столбец EMP_PCT будет хранить процент в виде числа, например 20% как 20.0 .

Я попытался ввести этот метод. Но он дал синтаксическую ошибку в инструкции ALTER TABLE .

Почему это не работает? Ниже приведен SQL, который я использую:

ALTER TABLE EMP_2
ADD EMP_PCT NUMBER(4,2);
4
nl ja de
Вы пытаетесь добавить новый столбец или изменить существующий столбец?
добавлено автор ErikE, источник
Если это процент, не подходит ли (5,2) , чтобы разрешить до 100,00?
добавлено автор ErikE, источник
Какая конкретная ошибка?
добавлено автор Hamlet Hakobyan, источник
я собираюсь изменить таблицу EMP_2, чтобы включить новый столбец с именем EMP_PCT с типом данных Number. Это EMP_PCT будет хранить процентное число. например: 20.00
добавлено автор user1933884, источник
вы правы, но проблема в том, что метод NUMBER (4,2) не работает
добавлено автор user1933884, источник

4 ответы

Доступ к именам типов данных DDL может быть сложным для сортировки. NUMBER фактически создает поле как float с двойной точностью. Но если вы попытаетесь включить размер поля, точность или масштаб в круглые скобки после NUMBER , вы получите синтаксическую ошибку. Следующий оператор создает двойное поле, выполняемое ли оно из ADO или DAO:

ALTER TABLE MyTable ADD COLUMN EMP_PCT NUMBER;

Следующий оператор добавляет столбец типа десятичного значения в MyTable с точностью = 4 и scale = 2, что означает, что он будет содержать до двух цифр слева от десятичной точки и 2 вправо.

CurrentProject.Connection.Execute "ALTER TABLE MyTable ADD COLUMN EMP_PCT DECIMAL (4,2);"

Я использовал CurrentProject.Connection для выполнения оператора DDL, потому что это объект ADO, а Access SQL позволяет создавать десятичное поле с ADO. Заявление вызывает синтаксическую ошибку, если вы попытаетесь выполнить ее из DAO, например, с помощью CurrentDb.Execute или из конструктора запросов Access. Подробнее см. Ссылка на тип поля - имена и значения для DDL, DAO и ADOX .

Как пояснил @ErikE, десятичный тип Access является проблематичным, особенно с Access 2003, который вы используете. Подумайте, можно ли использовать поле типа валюты вместо этого. Это позволяет избежать десятичной жутки и обеспечивает более высокую производительность из-за того, как движок db обрабатывает фиксированное число десятичных знаков.

2
добавлено
Это была копия и вставка из команды, которая работала в моей системе Access 2003. Я изменил только имя таблицы и тип данных. Я понятия не имею, что это не для вас.
добавлено автор HansUp, источник
он также не работает. это тоже ошибка
добавлено автор user1933884, источник

Во-первых, я рекомендую не использовать тип данных Decimal в Access 2003, потому что там являются ошибками с ним вокруг сортировки (неправильный порядок) и агрегации (суммы, усекающие дробную часть). В Access 2007 общая проблема решена, но не сортировка (хотя вы, возможно, можете исправить это в Access 2007, указав индекс в столбце).

Что касается вашего сценария, есть две очевидные проблемы:

  1. Вы должны использовать ADD COLUMN ColumnName not ADD ColumnName

  2. Правильный тип данных DECIMAL , потому что NUMBER вместо этого создает float с двойной точностью и не позволяет скобки после указания какого-либо размера , ( Возможно NUMERIC будет работать как синоним DECIMAL , но я не знаю.)

Так что это должно сработать для вас:

ALTER TABLE EMP_2 ADD COLUMN EMP_PCT DECIMAL(4,2);

Согласно HansUp и другим источникам, это не может быть отправлено через DAO (как в CurrentDb.Execute ), но должно выполняться через ADO ( CurrentProject.Connection.Execute ).

По-видимому, существует способ заставить этот SQL работать , но он требует изменения настроек базы данных:

The decimal data type isn't supported in the default Jet 4.0 mdb file. You have to use the SQL Server compatibility syntax (ANSI 92) setting to use the decimal data type in the SQL Window.

Click on the menu, Tools > Options. Click on the Tables/Query tab. Mark the check box for "This database" in the SQL Server compatibility syntax (ANSI 92) section. This mode will affect the entire db, including queries with wildcards, so you may want to try this on a copy of your db.

Если вы все еще не можете получить работу, вы можете рассмотреть этот метод ( благодаря Филиппу Грондье ):

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:

1
добавлено
@ user1933884 См. мое обновление. Можете ли вы использовать обычный код VB или это должно быть заявление SQL?
добавлено автор ErikE, источник
Я просто попробовал этот метод. В определении поля появляется синтаксическая ошибка
добавлено автор user1933884, источник

попробуй это

   ALTER TABLE EMP_2 ADD (EMP_PCT NUMBER (4,2));
0
добавлено
это все еще ошибка, появляется синтаксическая ошибка в определении поля
добавлено автор user1933884, источник

попробуй это,

ALTER TABLE EMP_2 
ADD COLUMN EMP_PCT NUMBER(4,2);

Или попробуйте использовать этот URL-адрес,

AddingFields

0
добавлено
ПОПРОБУЙТЕ СЕЙЧАС ... ответили ответ
добавлено автор Mari, источник
Вы добавляете столбец или изменяете существующий столбец?
добавлено автор Mari, источник
U правильно использует ms access 2003? Я добавил URL-адрес, который даст вам описание уровня пользовательского интерфейса, чтобы добавить столбец
добавлено автор Mari, источник
Он по-прежнему появляется синтаксическая ошибка снова
добавлено автор user1933884, источник
я просто попробую, все еще ошибка
добавлено автор user1933884, источник
Я хочу создать новый столбец, который еще не существует
добавлено автор user1933884, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)