В чем разница между квадратными скобками и одинарными кавычками для сглаживания в SQL Server?
Я видел некоторые имена столбцов псевдонимов людей, используя одинарные кавычки, например:
select orderID 'Order No' from orders
и другие используют квадратные скобки, например:
select orderID [Order No] from orders
Я склонен использовать квадратные скобки. Есть ли какие-либо предпочтения/разница?
4 ответов
чтобы ответить на вопрос "есть ли какие-либо предпочтения/разница":
Да, есть столько предпочтений, сколько есть мнения, но будьте осторожны, чьи предпочтения вы принимаете.
в качестве наилучшей практики рекомендуется писать переносимый SQL, если это не требует каких-либо дополнительных усилий.
для вашего конкретного образца так же легко написать портативный запрос:
select OrderId as "Order Id" from Orders
чем написать непереносимое одно:
select OrderId as [Order Id] from Orders
это не оправданно писать нестандартный SQL, когда есть эквивалентная переносимая форма с одинаковым количеством нажатий клавиш.
распространение [] для экранирования связано с такими инструментами, как SQL Server Management Studio и MS Access query builders, которые лениво избегают всего. Это может никогда не прийти в голову разработчику, который проводит свою карьеру в SQL Server, но скобки вызвали много расходов на протяжении многих лет перенос приложений Access и SQL Server на другие платформы баз данных. То же самое касается Инструменты Oracle, которые цитируют все. Неподготовленные разработчики видят DDL в качестве примеров, а затем переходят к использованию того же стиля при написании от руки. Это трудный цикл, чтобы сломать, пока инструменты не улучшатся, и мы требуем лучшего. В Oracle цитирование в сочетании со смешанным корпусом приводит к чувствительным к регистру базам данных. Я видел проекты, где люди цитировали каждый идентификатор в базе данных, и у меня было чувство, что я был в земле потерянных, где разработчики эволюционировали на острове без документации или статьи о передовой практике.
Если вы пишете DDL, с самого начала, с нормализованными, законными идентификаторами (используйте OrderId или order_Id вместо [Order Id], вы не беспокоитесь о мифическом ключевом слове, которое может потребоваться escape-символы; база данных сообщит вам, когда вы использовали зарезервированное слово. Я могу рассчитывать на один палец, когда мы когда-либо обновляли приложение с одной версии SQL Server на другую и имели какие-либо поломки из-за новая зарезервированные слова.
этот часто является предметом жарких дебатов, поэтому, если подумать об этом по-другому:
программисты C# не избегают всех своих переменных с помощью@, хотя это законно. Это будет считаться странной практикой и станет предметом насмешек в StackOverflow. Побег должен быть для крайних случаев. Но те же разработчики, которые пишут соответствующие идентификаторы C#, не против избежать каждого идентификатора в своем SQL, написав ужасно уродливый, непереносимый SQL-код. Как консультант, я встречал более одного программиста SQL Server, который честно думал, что [] требуется синтаксис. Я не виню разработчиков, я виню инструменты.
Это зависит от того, какие настройки у вас есть в силе ли '
s действительны или нет. И вы упустили "
. См.Идентификаторы С Разделителями:
когда QUOTED_IDENTIFIER имеет значение ON, SQL Server следует правилам ISO для использования двойных кавычек (") и одинарных кавычек ( ' ) в операторах SQL. Например:
двойные кавычки могут использоваться только для разграничения идентификаторов. Они не могут быть использованы для разделите символьные строки.
одинарные кавычки должны использоваться для заключения символьных строк. Они не могут использоваться для разграничения идентификаторов.
Если QUOTED_IDENTIFIER имеет значение OFF, SQL Server использует следующие правила для одинарных и двойных кавычек:
кавычки не могут использоваться для разделения идентификаторов. Вместо этого скобки должны использоваться в качестве ограничители.
одиночные или двойные кавычки можно использовать для того чтобы заключить строки характера.
и наконец:
разделители в скобках всегда можно использовать, независимо от настройки QUOTED_IDENTIFIER
где, во всех приведенных выше цитатах, когда они ссылаются на скобки, они говорят о []
скобках.
одинарные кавычки более читабельны. Как показано выше, выделено красным.
MySQL использует "backticks", чтобы избежать специальных символов.
MSSQL может использовать "двойные кавычки" или [скобки] для идентификаторов (таблиц, столбцов и т. д.)
и "одинарные кавычки" для символьных строк или псевдонимов.
квадратные скобки используются главным образом для инкапсуляции объектов, чтобы специальные символы, такие как пробелы, точки или дефисы, не создавали синтаксиса ошибки.
Я бы рекомендовал использовать ключевое слово " as " перед псевдонимами столбцов - это гораздо более читабельно.
select [column with spaces] as 'my col' from "table with spaces" where n = 'foo'
select "column with spaces" as 'my col' from [table with spaces] where n = 'foo'