В чем разница между квадратными скобками и одинарными кавычками для сглаживания в 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'

подход цитаты позволяет вам сделать это:

SELECT 1 AS 'bla[]bla'