Sql оператор in: Оператор SQL IN: примеры, синтаксис
Содержание
Обобщённое табличное выражение, оператор WITH
Обобщённое табличное выражение или CTE (Common Table Expressions) — это временный результирующий набор данных, к которому можно обращаться в последующих запросах.
Для написания обобщённого табличного выражения используется оператор WITH.
-- Пример использования конструкции WITH WITH Aeroflot_trips AS (SELECT TRIP.* FROM Company INNER JOIN Trip ON Trip.company = Company.id WHERE name = "Aeroflot") SELECT plane, COUNT(plane) AS amount FROM Aeroflot_trips GROUP BY plane;Выражение с WITH считается «временным», потому что результат не сохраняется где-либо на постоянной основе
в схеме базы данных, а действует как временное представление, которое существует только на время выполнения запроса,
то есть оно доступно только во время выполнения операторов SELECT, INSERT, UPDATE, DELETE или MERGE.
Оно действительно только в том запросе, которому он принадлежит, что позволяет улучшить структуру запроса, не загрязняя глобальное пространство имён.WITH название_cte [(столбец_1 [, столбец_2 ] …)] AS (подзапрос) [, название_cte [(столбец_1 [, столбец_2 ] …)] AS (подзапрос)] …Порядок использования оператора WITH:
- Ввести оператор WITH
- Указать название обобщённого табличного выражения
- Опционально: определить названия для столбцов получившегося табличного выражения, разделённых знаком запятой
- Ввести AS и далее подзапрос, результат которого можно будет использовать в других частях SQL запроса, используя имя, определённое на 2 этапе
- Опционально: если необходимо более одного табличного выражения, то ставится запятая и повторяются шаги 2-4
- Создаём табличное выражение Aeroflot_trips, содержащие все полёты, совершенные авиакомпанией «Aeroflot»
WITH Aeroflot_trips AS (SELECT plane, town_from, town_to FROM Company INNER JOIN Trip ON Trip.company = Company.id WHERE name = "Aeroflot") SELECT * FROM Aeroflot_trips;
plane | town_from | town_to |
---|---|---|
IL-86 | Moscow | Rostov |
IL-86 | Rostov | Moscow |
- Аналогично, создаём табличное выражение Aeroflot_trips, но с переименованными колонками
WITH Aeroflot_trips (aeroflot_plane, town_from, town_to) AS (SELECT plane, town_from, town_to FROM Company INNER JOIN Trip ON Trip. company = Company.id WHERE name = "Aeroflot") SELECT * FROM Aeroflot_trips;
aeroflot_plane | town_from | town_to |
---|---|---|
IL-86 | Moscow | Rostov |
IL-86 | Rostov | Moscow |
- С помощью оператора WITH определяем несколько табличных выражений
WITH Aeroflot_trips AS (SELECT TRIP.* FROM Company INNER JOIN Trip ON Trip.company = Company.id WHERE name = "Aeroflot"), Don_avia_trips AS (SELECT TRIP.* FROM Company INNER JOIN Trip ON Trip.company = Company.id WHERE name = "Don_avia") SELECT * FROM Don_avia_trips UNION SELECT * FROM Aeroflot_trips;
id | company | plane | town_from | town_to | time_out | time_in |
---|---|---|---|---|---|---|
1181 | 1 | TU-134 | Rostov | Moscow | 1900-01-01T06:12:00. 000Z | 1900-01-01T08:01:00.000Z |
1182 | 1 | TU-134 | Moscow | Rostov | 1900-01-01T12:35:00.000Z | 1900-01-01T14:30:00.000Z |
1187 | 1 | TU-134 | Rostov | Moscow | 1900-01-01T15:42:00.000Z | 1900-01-01T17:39:00.000Z |
1188 | 1 | TU-134 | Moscow | Rostov | 1900-01-01T22:50:00.000Z | 1900-01-02T00:48:00.000Z |
1195 | 1 | TU-154 | Rostov | Moscow | 1900-01-01T23:30:00.000Z | 1900-01-02T01:11:00.000Z |
1196 | 1 | TU-154 | Moscow | Rostov | 1900-01-01T04:00:00.000Z | 1900-01-01T05:45:00.000Z |
1145 | 2 | IL-86 | Moscow | Rostov | 1900-01-01T09:35:00.000Z | 1900-01-01T11:23:00.000Z |
1146 | 2 | IL-86 | Rostov | Moscow | 1900-01-01T17:55:00.000Z | 1900-01-01T20:01:00. 000Z |
Обобщённые табличные выражения были добавлены в SQL для упрощения сложных длинных запросов, особенно с множественными подзапросами. Их главная задача – улучшение читабельности,
простоты написания запросов и их дальнейшей поддержки. Это происходит за счёт сокрытия больших и сложных запросов в созданные именованные выражения, которые потом используются в основном запросе.
Руководство по SQL. Операторы. – PROSELYTE
Оператор – это зарезервированное слово, или символ, который используется в SQL выражениях с использованием WHERE для выполнения операции или операций, например, сравнение.
Операторы используется для описания условий в SQL выражении и для обслуживания группы SQL выражений.
В языке структурированных запросов SQL существует четыре типа операторов:
- Арифметические операторы
- Операторы сравнения
- Логические операторы
- Операторы, которые отрабатывают, если условие не выполняется.
Арифметические операторы
Предположим, что A = 100 и B = 200
Ссылка на примеры
Оператор | Описание | Пример |
---|---|---|
+ | Сложение – добавляет значение с другой стороны оператора | A + B = 300 |
– | Вычитание – отнимает значение справа от значения слева от оператора | A + B = -100 |
* | Умножение – умножает значения по обе стороны от оператора | A * B = 20000 |
/ | Деление – делит левое значение на правое значение от оператора | B / A = 2 |
% | Остаток от деления – делит левое значение на правое от оператора и возвращает остаток от деления. | B % A = 0 |
Операторы сравнения
Предположим, что A = 100 и B = 200
Ссылка на примеры
Оператор | Описание | Пример |
---|---|---|
= | Проверяет, равны ли значения слева и справа от оператора. Если да – возвращает true, если нет – false | (A = B) – false |
!= | Проверяет, равны ли значения слева и справа от оператора. Если да – возвращает false, если нет – true | (A != B) – true |
<> | Проверяет, равны ли значения слева и справа от оператора. Если да – возвращает false, если нет – true | (A <> B) – true. |
> | Проверяет, больше ли значение слева, чем значение справа от оператора. Если да – возвращает true, если нет – false | (A > B) – false |
< | Проверяет, меньше ли значение слева, чем значение справа от оператора. Если да – возвращает true, если нет – false | (A < B) – true |
>= | Проверяет, больше ли или равно значение слева, чем значение справа от оператора. Если да – возвращает true, если нет – false | (A >= B) – false |
<= | Проверяет, меньше ли или равно значение слева, чем значение справа от оператора. Если да – возвращает true, если нет – false | (A <= B) – true |
!< | Проверяет, чтобы значение слева было не меньше, чем значение справа от оператора. Если да – возвращает true, если нет – false. | (A !< B) – false |
!> | Проверяет, чтобы значение слева было не больше, чем значение справа от оператора. Если да – возвращает true, если нет – false. | (A !> B) – true |
Логические операторы
Ссылка на примеры
Оператор | Описание |
---|---|
ALL | Используется для сравнения значения со всеми значениями в другом множестве значений. |
AND | Разрешает существование нескольких условий в условии WHERE выражения SQL. |
ANY | Сравнивает значение с любым применимым значением в списке в соответствии с условием. |
BETWEEN | Ищет значения в указанном диапазоне. |
EXISTS | Ищет запись в таблице, которая соответствует заданным критериям. |
IN | Сравнивает значение в списке определённых буквенных значений. |
LIKE | Сравнивает значение, которое похоже на определённый шаблон. |
NOT | Делает логический оператор противоположным. Например, NOT IN, NOT EXISTS и т.д. |
OR | Комбинирует несколько условий в SQL выражении. |
IS NULL | Сравнивает значение с NULL. |
UNIQUE | Проверяет каждую запись в таблице на уникальность. |
На этом мы заканчиваем изучение операторов языка структурированных запросов SQL.
В следующей статье мы рассмотрим выражения (expressions) в языке SQL.
операторов Transact-SQL — SQL Server
Редактировать
Твиттер
Фейсбук
Электронная почта
- Статья
- 2 минуты на чтение
Применяется к: SQL Server Azure SQL База данных Azure SQL Управляемый экземпляр Azure Synapse Analytics Analytics Platform System (PDW)
Оператор SQL — это атомарная единица работы, которая либо полностью завершается успешно, либо полностью завершается ошибкой. Оператор SQL — это набор инструкций, состоящий из идентификаторов, параметров, переменных, имен, типов данных и зарезервированных слов SQL, который успешно компилируется. Службы Analysis Services создают неявную транзакцию для инструкции SQL, если в команде BeginTransaction
не указано начало транзакции. Службы Analysis Services всегда фиксируют неявную транзакцию в случае успешного выполнения инструкции и откатывают неявную транзакцию в случае сбоя команды.
Существует множество типов операторов. Возможно, самым важным является SELECT, который извлекает строки из базы данных и позволяет выбирать одну или несколько строк или столбцов из одной или нескольких таблиц в SQL Server. В этой статье перечислены категории инструкций для использования с Transact-SQL (T-SQL) в дополнение к инструкции SELECT
. Вы можете найти все утверждения, перечисленные в левой части навигации.
Резервное копирование и восстановление
Операторы резервного копирования и восстановления предоставляют способы создания резервных копий и восстановления из резервных копий. Дополнительные сведения см. в разделе Обзор резервного копирования и восстановления.
Язык определения данных
Операторы языка определения данных (DDL) определяют структуры данных. Используйте эти операторы для создания, изменения или удаления структур данных в базе данных. Эти заявления включают:
- ALTER
- Сопоставления
- СОЗДАТЬ
- СБРОС
- ОТКЛЮЧИТЬ ТРИГГЕР
- ВКЛЮЧИТЬ ТРИГГЕР
- ПЕРЕИМЕНОВАТЬ
- ОБНОВЛЕНИЕ СТАТИСТИКИ
- ТАБЛИЦА ОБРЕЗАНИЯ
Язык обработки данных
Язык манипулирования данными (DML) влияет на информацию, хранящуюся в базе данных. Используйте эти операторы для вставки, обновления и изменения строк в базе данных.
- ВКЛАДЫШ
- УДАЛИТЬ
- ВСТАВКА
- ВЫБЕРИТЕ
- ОБНОВЛЕНИЕ
- ОБЪЕДИНЕНИЕ
Операторы разрешений определяют, какие пользователи и логины могут получать доступ к данным и выполнять операции. Дополнительные сведения об аутентификации и доступе см. в Центре безопасности.
Service Broker — это функция, обеспечивающая встроенную поддержку приложений для обмена сообщениями и очередей. Дополнительные сведения см. в разделе Service Broker.
Параметры сеанса
Операторы SET определяют, как текущий сеанс обрабатывает параметры времени выполнения. Обзор см. в разделе операторы SET.
Предложение FOR (Transact-SQL) — SQL Server
- Статья
- 10 минут на чтение
Применяется к: SQL Server База данных SQL Azure Azure SQL Управляемый экземпляр
Используйте предложение FOR, чтобы указать один из следующих параметров для результатов запроса.
Разрешить обновления при просмотре результатов запроса в режиме просмотра курсора, указав FOR BROWSE .
Отформатируйте результаты запроса как XML, указав FOR XML .
Отформатируйте результаты запроса как JSON, указав FOR JSON .
Соглашения о синтаксисе Transact-SQL
Синтаксис
[ FOR { BROWSE || }] ::= XML { { RAW [( 'ИмяЭлемента') ] | АВТО } [ <КоммондирективесфорXML> [ , {XMLDATA | XMLSCHEMA [('TargetNameSpaceURI') ] } ] [ , ЭЛЕМЕНТЫ [ XSINIL | ОТСУТСТВУЮЩИЙ ] ] | ЯВНЫЙ [ <КоммондирективесфорXML> [ , XMLДАННЫЕ ] ] | ПУТЬ [( 'ИмяЭлемента') ] [ <КоммондирективесфорXML> [ , ЭЛЕМЕНТЫ [ XSINIL | ОТСУТСТВУЮЩИЙ ] ] ] } ::= [ , ДВОИЧНЫЙ BASE64 ] [ , ТИП ] [ , КОРЕНЬ [ ( 'Имя корня' ) ] ] ::= JSON { { АВТО | ПУТЬ } [ [ , КОРЕНЬ [ ( 'Имя корня' ) ] ] [ INCLUDE_NULL_VALUES] [ , БЕЗ_МАССИВА_Обертки ] ] }
FOR BROWSE
BROWSE
Указывает, что обновления разрешены при просмотре данных в курсоре режима просмотра DB-Library. Таблицу можно просматривать в приложении, если она содержит столбец с отметкой времени , таблица имеет уникальный индекс и параметр FOR BROWSE находится в конце инструкции SELECT, отправляемой экземпляру SQL Server.
Примечание
Вы не можете использовать HOLDLOCK
FOR BROWSE не может использоваться в инструкциях SELECT, которые соединяются оператором UNION.
Примечание
Если столбцы ключей уникального индекса таблицы допускают значение NULL, а таблица находится на внутренней стороне внешнего соединения, индекс не поддерживается в режиме просмотра.
Режим просмотра позволяет сканировать строки в таблице SQL Server и обновлять данные в таблице по одной строке за раз. Чтобы получить доступ к таблице SQL Server в вашем приложении в режиме просмотра, вы должны использовать один из следующих двух вариантов:
Оператор SELECT, который вы используете для доступа к данным из таблицы SQL Server, должен заканчиваться ключевыми словами FOR BROWSE . При включении параметра FOR BROWSE для использования режима просмотра создаются временные таблицы.
Чтобы включить режим просмотра с помощью параметра NO_BROWSETABLE , необходимо выполнить следующую инструкцию Transact-SQL:
УСТАНОВИТЬ NO_BROWSETABLE ВКЛ.
При включении NO_BROWSETABLE , все операторы SELECT ведут себя так, как если бы к операторам был добавлен параметр FOR BROWSE . Однако параметр NO_BROWSETABLE не создает временные таблицы, которые обычно используются параметром FOR BROWSE для отправки результатов вашему приложению.
При попытке доступа к данным из таблиц SQL Server в режиме просмотра с помощью запроса SELECT, включающего оператор внешнего соединения, и когда для таблицы определен уникальный индекс, присутствующий на внутренней стороне оператора внешнего соединения. , режим просмотра не поддерживает уникальный индекс. Режим просмотра поддерживает уникальный индекс только в том случае, если все ключевые столбцы уникального индекса могут принимать нулевые значения. Режим просмотра не поддерживает уникальный индекс, если выполняются следующие условия:
Вы пытаетесь получить доступ к данным из таблиц SQL Server в режиме просмотра с помощью запроса SELECT, который включает оператор внешнего соединения.
Уникальный индекс определен для таблицы, представленной на внутренней стороне оператора внешнего соединения.
Чтобы воспроизвести это поведение в режиме просмотра, выполните следующие действия:
В SQL Server Management Studio создайте базу данных с именем SampleDB.
В базе данных SampleDB создайте таблицу tleft и таблицу tright, каждая из которых содержит один столбец с именем c1. Определите уникальный индекс для столбца c1 в таблице tleft и настройте столбец так, чтобы он принимал нулевые значения. Для этого выполните следующие операторы Transact-SQL в соответствующем окне запроса:
CREATE TABLE tleft(c1 INT NULL UNIQUE) ; ИДТИ СОЗДАТЬ ТАБЛИЦУ tright(c1 INT NULL) ; ИДТИ
Вставьте несколько значений в левую и правую таблицы. Убедитесь, что вы вставили нулевое значение в таблицу tleft. Для этого выполните следующие инструкции Transact-SQL в окне запроса:
.
ВСТАВИТЬ В tleft VALUES(2) ; ВСТАВИТЬ В tleft VALUES(NULL) ; ВСТАВИТЬ В правильные ЗНАЧЕНИЯ(1) ; ВСТАВИТЬ В правильные ЗНАЧЕНИЯ(3) ; ВСТАВИТЬ В ПРАВИЛЬНЫЕ ЗНАЧЕНИЯ (НУЛЬ) ; ИДТИ
Включите параметр NO_BROWSETABLE . Для этого выполните следующие инструкции Transact-SQL в окне запроса:
.
УСТАНОВИТЬ NO_BROWSETABLE ВКЛ ; ИДТИ
Получите доступ к данным в таблице tleft и таблице tright с помощью оператора внешнего соединения в запросе SELECT. Убедитесь, что таблица tleft находится на внутренней стороне оператора внешнего соединения. Для этого выполните следующие инструкции Transact-SQL в окне запроса:
.
ВЫБРАТЬ tleft.c1 Слева ПРИСОЕДИНЯЙСЯ ON tлевый.c1 = правый.c1 ГДЕ tright.c1 <> 2 ;
Обратите внимание на следующий вывод в области результатов:
с1
—-
НУЛЕВОЙ
НУЛЕВОЙ
После выполнения запроса SELECT для доступа к таблицам в режиме просмотра результирующий набор запроса SELECT содержит два нулевых значения для столбца c1 в таблице tleft из-за определения правой инструкции внешнего соединения. Таким образом, в результирующем наборе нельзя различить нулевые значения, полученные из таблицы, и нулевые значения, введенные правым оператором внешнего соединения. Вы можете получить неправильные результаты, если вам придется игнорировать пустые значения из набора результатов.
Примечание
Если столбцы, включенные в уникальный индекс, не принимают значения NULL, все значения NULL в результирующем наборе были введены правым оператором внешнего соединения.
FOR XML
XML
Указывает, что результаты запроса должны быть возвращены в виде XML-документа. Должен быть указан один из следующих режимов XML: RAW, AUTO, EXPLICIT. Дополнительные сведения о XML-данных и SQL Server см. в разделе FOR XML (SQL Server).
СЫРЬЕ [ (‘ ElementName ‘) ]
Берет результат запроса и преобразует каждую строку в результирующем наборе в элемент XML с общим идентификатором
AUTO
Возвращает результаты запроса в виде простого вложенного XML-дерева. Каждая таблица в предложении FROM, для которой хотя бы один столбец указан в предложении SELECT, представлена как элемент XML. Столбцы, перечисленные в предложении SELECT, сопоставляются с соответствующими атрибутами элемента. Дополнительные сведения см. в разделе Использование режима AUTO с FOR XML.
EXPLICIT
Указывает, что форма результирующего XML-дерева определяется явно. При использовании этого режима запросы должны быть написаны особым образом, чтобы дополнительная информация о желаемой вложенности указывалась явно. Дополнительные сведения см. в разделе Использование режима EXPLICIT с FOR XML.
XMLDATA
Возвращает встроенную схему XDR, но не добавляет к результату корневой элемент. Если XMLDATA указан, к документу добавляется схема XDR.
Важно
Директива XMLDATA устарела . Используйте генерацию XSD в случае режимов RAW и AUTO. Нет замены директиве XMLDATA в режиме EXPLICIT. Эта функция будет удалена в будущей версии Microsoft SQL Server. Избегайте использования этой функции в новых разработках и планируйте модифицировать приложения, которые в настоящее время используют эту функцию.
Подавление нежелательных разрывов строк: Вы можете использовать SQL Server Management Studio (SSMS) для создания запроса, использующего предложение FOR XML. Иногда большое количество XML возвращается и отображается в одной ячейке сетки. Строка XML может быть длиннее, чем одна ячейка сетки SSMS может содержать одну строку. В этих случаях SSMS может вставлять символы разрыва строки между длинными сегментами всей строки XML. Такие разрывы строк могут возникать в середине подстроки, которую не следует разбивать на строки. Вы можете предотвратить разрывы строк, используя приведение AS XMLDATA. Это решение также может применяться при использовании FOR JSON PATH. Этот метод обсуждается в Stack Overflow и показан в следующем образце оператора SELECT Transact-SQL:
Использование SQL Server FOR XML: преобразование типа данных результата в текст/varchar/строку?
ВЫБЕРИТЕ ПРИВОД( (ВЫБЕРИТЕ столбец1, столбец2 ИЗ my_table ДЛЯ ПУТИ XML('') ) КАК ВАРЧАР(МАКС) ) КАК XMLDATA ;
XMLSCHEMA [ (‘ TargetNameSpaceURI ‘) ]
Возвращает встроенную схему XSD. Вы можете дополнительно указать URI целевого пространства имен при указании этой директивы, которая возвращает указанное пространство имен в схеме. Дополнительные сведения см. в разделе Создание встроенной схемы XSD.
ELEMENTS
Указывает, что столбцы возвращаются как подэлементы. В противном случае они сопоставляются с атрибутами XML. Этот параметр поддерживается только в режимах RAW, AUTO и PATH. Дополнительные сведения см. в разделе Использование режима RAW с FOR XML.
XSINIL
Указывает, что для значений столбца NULL должен быть создан элемент с атрибутом xsi:nil , для которого установлено значение True . Эта опция может быть указана только с директивой ELEMENTS. Для получения дополнительной информации см.:
- Создание элементов для значений NULL с параметром XSINIL.
- FOR XML в операторе SELECT
ОТСУТСТВУЕТ
Указывает, что для пустых значений столбца соответствующие элементы XML не будут добавлены в результат XML. Укажите этот параметр только с ELEMENTS.
PATH [ (‘ ElementName ‘) ]
Создает оболочку элемента
BINARY BASE64
Указывает, что запрос возвращает двоичные данные в двоичном формате с кодировкой base64. При извлечении двоичных данных с использованием режима RAW и EXPLICIT этот параметр должен быть указан. Это значение по умолчанию в режиме AUTO.
TYPE
Указывает, что запрос возвращает результаты в виде xml тип. Дополнительные сведения см. в разделе Директива TYPE в FOR XML Queries.
ROOT [ (‘ RootName ‘) ]
Указывает, что в результирующий XML должен быть добавлен один элемент верхнего уровня. При желании вы можете указать имя корневого элемента для создания. Если необязательное корневое имя не указано, добавляется элемент
Дополнительные сведения см. в разделе FOR XML (SQL Server).
Пример FOR XML
В следующем примере указано FOR XML AUTO
с параметрами TYPE
и XMLSCHEMA
. Из-за опции TYPE
результирующий набор возвращается клиенту как тип xml . Параметр XMLSCHEMA
указывает, что встроенная схема XSD включается в возвращаемые XML-данные, а параметр ELEMENTS
указывает, что результат XML ориентирован на элементы.
ИСПОЛЬЗОВАТЬ AdventureWorks2012; ИДТИ ВЫБЕРИТЕ p.BusinessEntityID, Имя, Фамилия, Телефонный Номер КАК Телефон ОТ Лицо.Лицо КАК р ПРИСОЕДИНЯЙТЕСЬ к Person.PersonPhone КАК pph ON p.BusinessEntityID = pph.BusinessEntityID ГДЕ Фамилия КАК 'G%' ЗАКАЗАТЬ ПО Фамилии, Имени FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;
FOR JSON
JSON
Укажите FOR JSON для возврата результатов запроса в формате текста JSON. Вы также должны указать один из следующих режимов JSON: AUTO или PATH. Дополнительные сведения о предложении FOR JSON см. в разделе Форматирование результатов запроса в формате JSON с помощью FOR JSON (SQL Server).
AUTO
Автоматически форматируйте выходные данные JSON на основе структуры оператора SELECT
, указав FOR JSON AUTO . Дополнительные сведения и примеры см. в разделе Автоматическое форматирование вывода JSON в режиме AUTO (SQL Server).
PATH
Получите полный контроль над форматом вывода JSON, указав
FOR JSON PATH . Режим PATH позволяет создавать объекты-оболочки и вкладывать сложные свойства. Дополнительные сведения и примеры см. в разделе Форматирование вложенных выходных данных JSON в режиме PATH (SQL Server).
INCLUDE_NULL_VALUES
Включите нулевые значения в выходные данные JSON, указав параметр INCLUDE_NULL_VALUES с предложением FOR JSON . Если вы не укажете этот параметр, выходные данные не будут включать свойства JSON для нулевых значений в результатах запроса. Дополнительные сведения и примеры см. в разделе Включение нулевых значений в выходные данные JSON с параметром INCLUDE_NULL_VALUES (SQL Server).
ROOT [ (‘ RootName ‘) ]
Добавьте один элемент верхнего уровня к выходным данным JSON, указав параметр ROOT с предложением FOR JSON . Если вы не укажете параметр ROOT , выходные данные JSON не будут иметь корневого элемента. Дополнительные сведения и примеры см. в разделе Добавление корневого узла в выходные данные JSON с параметром ROOT (SQL Server).
WITHOUT_ARRAY_WRAPPER
Удалите квадратные скобки, окружающие вывод JSON по умолчанию, указав Параметр WITHOUT_ARRAY_WRAPPER с предложением FOR JSON . Если вы не укажете этот параметр, вывод JSON будет заключен в квадратные скобки. Используйте параметр WITHOUT_ARRAY_WRAPPER для создания одного объекта JSON в качестве вывода.