Этот ответ предназначен для Microsoft SQL Server, в частности MSSQL 2008 R2.
В рукописном SQL я бы никогда не заключал в кавычки числа (если только не вставить значение в столбец varchar, где вставленная строка просто является числом). Но иногда при генерации SQL программным способом можно упростить жизнь, просто цитируя все. (Это в сценариях обслуживания базы данных или в подпрограммах библиотеки, которые работают с любой таблицей, не зная заранее типов столбцов.)
Интересно, будет ли это налагаться на производительность? Если в своем выражении SQL я использовал значение в кавычках, сервер должен проанализировать его как строку, а затем преобразовать в целое число. Но тогда синтаксический анализ SQL в любом случае будет включать преобразование строк в целые числа. И время разбора запроса обычно составляет лишь небольшую часть от общего.
Я запустил несколько тестовых утверждений, похожих на
insert into #t values (123, 123, 123), (123, 123, 123)
insert into #t values ('123', '123', '123'), ('123', '123', '123')
, но с большим числом столбцов в #t
, большее количество кортежей значений вставляется за один раз, и каждый оператор повторяется много раз. Я использовал Perl для этого:
$dbh = my_database_connection(); # using DBD::Sybase
$n = 20; # this many value tuples, and also repeated this many times
$v = "'123'";
# $v = 123; # uncomment this to insert without quoting
@cols = 'aa' .. 'zz';
@ds = map { "[$_] int not null" } @cols;
@vs = map { $v } @cols;
$" = ", ";
$dbh->do("create table #t (@ds)");
foreach (1 .. $n) {
$sql = 'insert into #t values ';
$sql .= "(@vs), " foreach 1 .. $n;
$sql =~ s/, \z//;
$dbh->do($sql);
}
но вы можете тривиально написать один и тот же тест на любом языке. Я запускал это несколько раз для цитируемого случая и для не цитируемого, и не наблюдал существенной разницы в скорости. (На моей установке один запуск занял около десяти секунд; очевидно, вы можете изменить $n
, чтобы сделать его быстрее или медленнее.)
Конечно, сгенерированный SQL больше, если в нем есть избыточные символы кавычек. Это, конечно, не может быть немного быстрее, но, похоже, заметно медленнее.
Учитывая этот результат, я упросту свой код генерации SQL, добавив одинарные кавычки вокруг всех значений, без необходимости знать тип данных столбца, в который нужно вставить. (Код по-прежнему нужно защищать от внедрения SQL, следя за тем, чтобы входное значение само по себе не содержало символ ', или иным образом умело цитировал.)
Я по-прежнему не рекомендую заключать числа в SQL в обычном порядке, но если вы обнаружите, что должны это сделать, это не причинит никакого вреда. Точно так же в сгенерированном коде я помещаю []
вокруг имен столбцов, независимо от того, нужен он или нет, но я считаю, что это ненужная затея в рукописном SQL.