C#. Экранирование спецсимволов в строке для SQL запроса

306
06 сентября 2017, 12:04

Есть ли стандартные функции экранирования строк для SQL запроса? Я имею в виду вместо добавления в SqlCommand параметров, может можно безопасно вставлять необходимые мне значения прямо в текст SQL запроса? Мне в любом случае необходимо объединять строки для вставки значений вроде "@p1, @p2" и так далее. Мне кажется если вставлять данные напрямую программа будет работать быстрее, но без экранирования может быть sql injection.

Answer 1

В SQL Server есть кэш планов. При выполнении каждого запроса SQL Server смотрит, есть ли уже существующий план в кэше, и если есть - экономит время за счет переиспользования плана.

Поиск в кэше осуществляется по тексту запроса. Значения параметров в текст запроса не входят.

Если вы пришлете запрос с другим текстом - SQL Server вынужден будет построить план заново. Построение плана - дорогая операция. Иногда она даже дороже, чем само выполнение запроса.

Вот такие запросы, со значением прямо в тексте, потребуют двух компиляций запроса в план:

SELECT * FROM AdventureWorks2008R2.Production.Product 
WHERE ProductSubcategoryID = 1;
SELECT * FROM AdventureWorks2008R2.Production.Product 
WHERE ProductSubcategoryID = 4;

Если вы пришлете запрос с тем же текстом, но другими значениями параметров - SQL Server использует существующий план, что гораздо быстрее:

-- первое выполнение вызовет построение плана
SELECT * FROM AdventureWorks2008R2.Production.Product 
WHERE ProductSubcategoryID = @ProductSubcategoryID;
-- используется существующий план, вне зависимости от значения @ProductSubcategoryID
SELECT * FROM AdventureWorks2008R2.Production.Product 
WHERE ProductSubcategoryID = @ProductSubcategoryID;

Т.е. то, что вы пытаетесь сделать - вставлять значения прямо в текст запроса - не ускорит, а наоборот, замедлит выполнение. Не говоря уже о проблемах с безопасностью, которые вы при этом получите.

Причем производительность падает настолько, что в SQL Server 2005 добавили режим FORCED параметризации, который принудительно делает из непараметризированных запросов параметризированные - т.е. MS очень старательно пытается заставить вас использовать параметры ради производительности. Вплоть до графиков в SQL Azure, где рисуется нагрузка вашей базы, и нагрузка "вот такой она могла бы быть при использовании параметров".

Answer 2

Наоборот, запросы с параметрами будут работать быстрее, поскольку БД запоминает их и постепенно оптимизирует. А в случае цельного запроса, она будет считать каждый запрос новым и от аналогичных запросов ничего оставаться не будет.

READ ALSO
Xamarin бесплатен?

Xamarin бесплатен?

Можно ли использовать Xamarin бесплатно делая на нём коммерческие программы?

402
Пропадают подсказки в ReSharper [требует правки]

Пропадают подсказки в ReSharper [требует правки]

Пользуюсь решарпером в Visual StudioПосле некоторого времени начинают пропадать подсказки при наборе кода

353
Количество строк и столбцов с данными EPPlus

Количество строк и столбцов с данными EPPlus

Для работы с Excel использую библиотеку EPPlusКак с ее помощью получить количество строк и столбцов на листе, в которых есть данные?

326
Сколько должно быть потоков? [требует правки]

Сколько должно быть потоков? [требует правки]

Есть программа по удалению SSDК примеру, пользователь может задать количество потоков для удаления файлов, если на задал - необходимо выбрать...

294