Приложение 2. Некоторые типичные ошибки SQL
При отладке программ неизбежно обнаруживаются разнообразные ошибки. Рассмотрим некоторые типичные ситуации при работе в SQL Management Studio.
Команда: SELCT * FROM k_bill Ошибка: Msg 102, Level 15, State 1, Line 1 Неправильный синтаксис около конструкции "*". Объяснение: Синтаксическая ошибка, пропущена буква в слове SELECT. Команда: INSERT INTO k_firm (firm_name, firm_addr) VALUES(10, 'Сигма', 'Киев'); Ошибка: Msg 110, Level 15, State 1, Line 1 Число столбцов в инструкции INSERT меньше числа значений, указанных в предложении VALUES. Число значений в предложении VALUES должно соответствовать числу столбцов, указанному в инструкции INSERT. Объяснение: В команде вставки в списке полей перечислены два поля, а в списке значений – три значения.
Команда: INSERT INTO k_firm (firm_num, firm_name, firm_addr) VALUES(10, 'Сигма', 'Киев'); Ошибка: Msg 544, Level 16, State 1, Line 1 Невозможно вставить явное значение для столбца идентификаторов в таблице "k_firm", когда параметр IDENTITY_INSERT имеет значение OFF. Объяснение: По умолчанию нельзя указывать явное значение для поля, у которого установлено свойство IDENTITY, т.е., для поля firm_num. Если требуется явно указывать значения для таких полей, следует предварительно выполнить команду: SET IDENTITY_INSERT ON
Команда: INSERT INTO k_staff (staff_name, dept_num, staff_hiredate, staff_post) VALUES('Смит', 4, GETDATE(), 'Менеджер'); Ошибка: Msg 547, Level 16, State 0, Line 1 Конфликт инструкции INSERT с ограничением FOREIGN KEY "fk_staff_dept_num". Конфликт произошел в базе данных "kontora", таблица "dbo.k_dept", column 'dept_num'. Выполнение данной инструкции было прервано. Объяснение: Нарушено ограничение внешнего ключа: мы пытаемся вставить ссылку на несуществующий отдел с номером 4.
Команда: DELETE FROM k_contract WHERE contract_num=1 Ошибка: Msg 547, Level 16, State 0, Line 1 Конфликт инструкции DELETE с ограничением REFERENCE "fk_bill_contract_num". Конфликт произошел в базе данных "kontora", таблица "dbo.k_bill", column 'contract_num'.
Выполнение данной инструкции было прервано. Объяснение: Нарушено ограничение внешнего ключа: мы пытаемся удалить договор с номером 1, а к этому договору привязаны счета в таблице k_bill.
Команда: SELECT * FROM k_contract WHERE contract_date BETWEEN '01/03/2012' AND '31/03/2012' Ошибка: Msg 242, Level 16, State 3, Line 1 Преобразование типа данных char в тип данных datetime привело к значению datetime за пределами диапазона. Объяснение: Видимо, на компьютере установлен другой формат даты. Если вы хотите задать определенный формат даты, например, день:месяц:год, выполните команду: SET DATEFORMAT dmy
Команда: SELECT price_name, MIN(price_sum) FROM k_price Ошибка: Msg 8120, Level 16, State 1, Line 1 Столбец "k_price.price_name" недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY. Объяснение: Если используются агрегирующие функции без группировки, в списке полей могут присутствовать только агрегирующие функции.
Команда: SELECT contract_num, contract_date, bill_num, bill_date FROM k_bill, k_contract WHERE k_bill.contract_num=k_contract.contract_num Ошибка: Msg 209, Level 16, State 1, Line 1 Неоднозначное имя столбца "contract_num". Объяснение: Если в нескольких таблицах, используемых в запросе, есть поля с одинаковыми названиями, то для обращения к таким полям следует использовать синтаксис имя_таблицы.имя_поля или псевдоним.имя_поля.
Команда: SELECT contract_num, contract_date FROM k_contract WHERE contract_num = (SELECT contract_num FROM k_bill WHERE bill_date BETWEEN '01/01/2012' AND '12/31/2012' AND k_contract.contract_num=k_bill.contract_num) Ошибка: Msg 512, Level 16, State 1, Line 1 Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =,!=, <, <=, >, >= или используется в качестве выражения. Объяснение: Нельзя использовать обычные операции сравнения с подзапросом, если подзапрос возвращает несколько строк. Следует использовать ключевые слова ALL или ANY.
Команда: INSERT INTO k_dept (dept_short_name, dept_full_name) VALUES('Служба безопасности', 'Отдел №1'); Ошибка: Msg 8152, Level 16, State 14, Line 1 Символьные или двоичные данные могут быть усечены. Выполнение данной инструкции было прервано. Объяснение: Длина значения в строковом поле не должна превышать длину поля, заданную при создании таблицы.
Читайте также: II. НЕКОТОРЫЕ МЕТОДИКИ АНАЛИЗА ПЕДАГОГИЧЕСКОГО ОБЩЕНИЯ Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|