В чем разница между квадратными скобками и одинарными кавычками для псевдонимов в SQL Server?

Я видел некоторые имена псевдонимов людей, используя одинарные кавычки, например:

select orderID 'Order No' from orders

и другие используют квадратные скобки, например:

select orderID [Order No] from orders

Я склонен использовать квадратные скобки. Есть ли предпочтения/различия?

Ответ 1

Чтобы ответить на вопрос "есть ли какие-либо предпочтения/различия":

Да, есть так много предпочтений, как есть мнения, но будьте осторожны, чьи предпочтения вы принимаете.

В качестве наилучшей практики рекомендуется писать переносимый SQL, если он не требует дополнительных усилий.

Для вашего конкретного примера так же легко написать переносимый запрос:

select OrderId as "Order Id" from Orders

Чем писать непереносимый:

select OrderId as [Order Id] from Orders

Невозможно написать нестандартный SQL, если имеется эквивалентная переносная форма того же числа нажатий клавиш.

Распространение [] для экранирования связано с такими инструментами, как SQL Server Management Studio и сборщиками запросов MS Access, которые лениво избегают всего. Это может никогда не произойти с разработчиком, который проводит свою карьеру в SQL Server, но скобки привели к большим расходам на протяжении многих лет, перенося приложения Access и SQL Server на другие платформы баз данных. То же самое касается инструментов Oracle, которые цитируют все. Необученные разработчики видят DDL в качестве примеров, а затем приступают к использованию того же стиля при написании вручную. Это трудный цикл, который нужно преодолеть, пока инструменты не улучшатся, и мы требуем лучшего. В Oracle цитирование в сочетании со смешанным корпусом приводит к базе данных, чувствительным к регистру. Я видел проекты, в которых люди цитировали каждый идентификатор в базе данных, и у меня было ощущение, что я был в The Land of the Lost, где разработчики эволюционировали на острове без документации или статей лучшей практики.

Если вы пишете свой DDL, с самого начала, с нормализованными юридическими идентификаторами (используйте OrderId или order_Id вместо [Идентификатор заказа], вы не беспокоитесь о мифическом ключевом слове, которому могут понадобиться escape-символы, база данных будет информировать вы, когда используете зарезервированное слово. Я могу рассчитывать на один палец, когда мы когда-либо обновляли приложение с одной версии SQL Server до другого, и имели любые поломки из-за новых зарезервированных слов.

Это часто является предметом жарких споров, поэтому, если вы думаете об этом по-другому:

Программисты С# не избегают всех своих переменных с @, даже если это законно. Это будет считаться странной практикой и будет предметом насмешек над StackOverflow. Экранирование должно быть для краевых случаев. Но те же разработчики, которые пишут соответствующие идентификаторы С#, не прочь избежать каждого отдельного идентификатора в своем SQL, написав ужасно уродливый, не переносимый SQL-код. В качестве консультанта я встретил более одного программиста SQL Server, который, честно говоря, считал, что требуется синтаксис []. Я не виню разработчиков, я виню инструменты.

Ответ 2

Это зависит от того, какие настройки у вас есть, действует ли ' или нет. И вы пропустили ". См. Обозначенные идентификаторы:

Когда QUOTED_IDENTIFIER установлен в положение ON, SQL Server следует правилам ISO для использования двойных кавычек (") и одинарной кавычки (') в операторах SQL. Например:

  • Двойные кавычки могут использоваться только для разграничения идентификаторов. Они не могут использоваться для разграничения строк символов.

  • Одиночные кавычки должны использоваться, чтобы заключать символьные строки. Они не могут использоваться для разграничения идентификаторов.


Если для QUOTED_IDENTIFIER установлено значение OFF, SQL Server использует следующие правила для одиночных и двойных кавычек:

  • Котировки не могут использоваться для разграничения идентификаторов. Вместо этого скобки должны использоваться как разделители.

  • Одиночные или двойные кавычки могут использоваться, чтобы заключить символьные строки.

И наконец:

Разделители в скобках всегда можно использовать независимо от настройки QUOTED_IDENTIFIER

Где во всех приведенных выше цитатах, когда они ссылаются на скобки, они говорят о скобках [].

Ответ 3

Одиночные кавычки более читабельны. Как показано выше, выделено красным цветом.

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'

Ответ 4

Этот подход позволяет вам сделать следующее:

SELECT 1 AS 'bla[]bla'