Распространенные ошибки SQL в хранимых процедурах и запросах
Я не буду описывать совсем банальные вроде ошибки синтаксиса (talbe вместо table). Рассмотрим досадные ошибки sql server, которые снижают скорость нашей разработки:
1. Ключевые слова в именах
Например, у вас есть поле Key. Его нужно заключать обязательно в скобки
select Name from @table where [Key]='code1'
2. Проблемы при приведении типов
Лучше явно приводить типы в запросах через cast и convert
select cast(itemID as nvarchar) + ' ' + name from @table
В случае, если у вас разнородная таблица (поле itemID может быть как строкой, так и числом), то для избежания исключения в запросе рекомендуется использовать try_cast или try_convert
3. Неверно поставленные скобки в условиях
select * from @table where @visible =1 and (isVisible=1 or @visible=0)
Лучше явно выделить условия скобками, чтобы было проще читать (даже, если приоритет операций не требует этого, как в этом случае).
select * from @table where (@visible =1 and isVisible=1) or @visible=0
4. Ошибка сравнения с NULL полями
Если вы сравниваете null bit поле с false, то нужно делать это аккуратно.
Такое сравнение корректно:
select * from @table where isVisible=1
Такое сравнение некорректно:
select * from @table where isVisible=0
Дело в том, что оно не учитывает что поле может быть null (а следовательно в бизнес-логике это видимость равно false)
Правильный вариант:
select * from @table where isnull(isVisible, 0)=0
Также будьте аккуратны с NULL и использованием оператора NOT IN (). Рассмотрите вариант использования Exists
5. При группировке использование полей в select или order, которые не участвуют в группировке
Вы можете использовать либо поля, по которым идет группировка, либо агрегирующие данные.
Ошибочный пример:
select code, name, count(*)
from table1
group by code
6. Путаница с порядком ключевых слов в select
Используйте правильный порядок
select
from (join)
where
group by
having
order by
7. Страсть к join, left join
Если вам нужно вытянуть 1 поле из соседней таблицы, то используйте подзапросы. Чтобы запрос работал быстро, вам нужно как можно быстрее отсечь ненужные данные. Если вы делаете объединение несколько больших таблиц, в итоге у вас получается большая масса данных по которым затем идет фильтрация.
Выберите сначала данные из одной таблицы, для отобранных данных уже через подзапрос в select можно достать все дополнительные данные.
select id, (select name from cats where id = catID) catName from products
8. Дубли имен в select при join
Ошибка SQL запроса:
select id, name from products inner join cats on product.catID = cats.id
Проблема в том что id есть в обоих таблицах.
Необходимо указать точнее
select products.id, products.name from products inner join cats on product.catID = cats.id
9. Умеренно используйте функции в Where
Если вы используете функции Datepart или подобные, то вероятно это приведет к тому, что индексы на используемых полях не будут задействованы в запросе (что плохо для производительности).
По возможности переделайте запрос так, чтобы можно было обойтись минимумом функций в where.
10. Подзапрос вернул несколько значений
Бывает так, что вы ожидаете, что ваш подзапрос должен вернуть одно значение. Но потом бизнес-логика и структура БД меняется, и ваш запрос может уже возвращать несколько значений и будет появляться исключение.
Можно подстраховаться и поставить в подзапросе top 1. В этом случае вы гарантированно получите максимум 1 значение.
11. Конкатенация строк с NULL
В итоге вы получите NULL для всех строки.
Если вы формируете большую строку в SELECT, то используйте функции NULLIF(col, defValue). Если колонку будет NULL, то функция подставить значение по умолчанию (например, пустую строку) и вся ваша большая формируемая строка не будет NULL.
select name + '' + nullif(descriotion, '') from products
Минутка саморекламы
Мы создаем веб-оболочку для MS SQL Server. Называется она Falcon Space.
Вся разработка и управление системой происходит через SQL.
Вывод любого компонента (таблицы, формы, дашборды, календари и др), настройки страницы - все делается через SQL.На демостенде показаны примеры компонентов веб-платформы
Полная документация по системе описана здесь - https://falconspace.ru/docs
Также мы собрали список статей по данной теме, где вы можете узнать и о других более простых ошибках.
Что еще посмотреть по SQL Server
SQL. Получение null при конкатенации (объединении) строк
SQL. Проблема с доступом к таблице БД
SQL Management Studio медленно работает, тормозит. Как решить проблему
Не запускается Configuration Manager
Решение проблем MS SQL Server с блокировками
Решение ошибки Cannot resolve the collation conflict between
Сколько памяти использует SQL Server
Не создается диаграмма в SQL Server. Ошибка при создании диаграмм БД
Разработчик SQL, нужны клиенты и заказы?
Выгода от использования Falcon Space
В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта