Распространенные ошибки 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 Server. Ошибка Table:String or binary data would be truncated. The statement has been terminated.

SQL Management Studio медленно работает, тормозит. Как решить проблему

Не запускается Configuration Manager

Решение проблем MS SQL Server с блокировками

Решение ошибки Cannot resolve the collation conflict between

SQL. Ошибка. Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Сколько памяти использует SQL Server

Не создается диаграмма в SQL Server. Ошибка при создании диаграмм БД

Проблема Не получается сделать take offline для базы данных

Ошибка SQL Server Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation

Разработчик SQL, нужны клиенты и заказы?

Прямые заказы от клиентов. Нужно знать только SQL и HTML
Работа на MS SQL Server

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK