---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://ydb.tech/docs/en/concepts/query_execution/federated_query/ms_sql_server.md?version=v25.3
  - https://ydb.tech/docs/ru/concepts/query_execution/federated_query/ms_sql_server.md?version=v25.3
  - href: ru/concepts/query_execution/federated_query/ms_sql_server.md
    type: text/markdown
    title: Markdown version
  - href: ../../../llms.txt
    type: text/markdown
    title: llms.txt
sourcePath: ru/core/concepts/query_execution/federated_query/ms_sql_server.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# Работа с базами данных Microsoft SQL Server

В этом разделе описана основная информация про работу с внешней базой данных [Microsoft SQL Server](https://learn.microsoft.com/ru-ru/sql/?view=sql-server-ver16).

Для работы с внешней базой данных Microsoft SQL Server необходимо выполнить следующие шаги:

1. Создать [секрет](https://ydb.tech/docs/ru/concepts/datamodel/secrets.md?version=v25.3), содержащий пароль для подключения к базе данных.

    ```yql
    CREATE OBJECT ms_sql_server_datasource_user_password (TYPE SECRET) WITH (value = "<password>");
    ```

1. Создать [внешний источник данных](https://ydb.tech/docs/ru/concepts/datamodel/external_data_source.md?version=v25.3), описывающий определённую базу данных Microsoft SQL Server. Параметр `LOCATION` содержит сетевой адрес экземпляра Microsoft SQL Server, к которому осуществляется подключение. В `DATABASE_NAME` указывается имя базы данных (например, `master`). Для аутентификации во внешнюю базу используются значения параметров `LOGIN` и `PASSWORD_SECRET_PATH`. Включить шифрование соединений к внешней базе данных можно с помощью параметра `USE_TLS="TRUE"`.

    ```yql
    CREATE EXTERNAL DATA SOURCE ms_sql_server_datasource WITH (
        SOURCE_TYPE="MsSQLServer",
        LOCATION="<host>:<port>",
        DATABASE_NAME="<database>",
        AUTH_METHOD="BASIC",
        LOGIN="user",
        PASSWORD_SECRET_NAME="ms_sql_server_datasource_user_password",
        USE_TLS="TRUE"
    );
    ```

1. <!-- source: ru/concepts/query_execution/federated_query/_includes/connector_deployment.md -->
    Развернуть [коннектор](https://ydb.tech/docs/ru/concepts/query_execution/federated_query/architecture.md?version=v25.3#connectors)  и [настроить](https://ydb.tech/docs/ru/devops/deployment-options/manual/federated-queries/index.md?version=v25.3)  динамические узлы YDB на взаимодействие с ним. Также необходимо обеспечить сетевой доступ с динамических узлов YDB к внешнему источнику данных (по адресу, указанному в параметре `LOCATION` запроса `CREATE EXTERNAL DATA SOURCE`). В случае, если на предыдущем шаге было включено шифрование сетевых соединений к внешнему источнику, коннектор будет использовать системные корневые сертификаты (более подробно о настройке TLS можно узнать в [инструкции](https://ydb.tech/docs/ru/devops/deployment-options/manual/federated-queries/connector-deployment.md?version=v25.3) по разворачиванию коннектора).
   <!-- endsource: ru/concepts/query_execution/federated_query/_includes/connector_deployment.md -->
1. [Выполнить запрос](#query) к базе данных.

## Синтаксис запросов {#query}

Для работы с Microsoft SQL Server используется следующая форма SQL-запроса:

```yql
SELECT * FROM ms_sql_server_datasource.<table_name>
```

где:

- `ms_sql_server_datasource` - идентификатор внешнего источника данных;
- `<table_name>` - имя таблицы внутри внешнего источника данных.

## Ограничения {#limitations}

При работе с кластерами Microsoft SQL Server существует ряд ограничений:

1. <!-- source: ru/concepts/query_execution/federated_query/_includes/supported_requests.md -->
   Внешние источники доступны только для чтения данных через запросы `SELECT`. Запросы, модифицирующие таблицы во внешних источниках, движком обработки федеративных запросов в настоящее время не поддерживаются.
   <!-- endsource: ru/concepts/query_execution/federated_query/_includes/supported_requests.md -->
1. <!-- source: ru/concepts/query_execution/federated_query/_includes/datetime_limits.md -->
   Если значение даты, хранящейся во внешнем источнике данных, находится вне допустимого для YDB диапазона (все используемые даты должны быть позднее 1970-01-01, но ранее 2105-12-31), в YDB такое значение будет преобразовано в `NULL`.
   <!-- endsource: ru/concepts/query_execution/federated_query/_includes/datetime_limits.md -->
1. <!-- source: ru/concepts/query_execution/federated_query/_includes/predicate_pushdown.md -->
   Система обработки федеративных запросов YDB умеет передавать исполнение некоторых частей запроса системе, выступающей в качестве источника данных. Фрагменты запроса передаются сквозь YDB непосредственно во внешнюю систему и обрабатываются внутри неё. С помощью этой оптимизации, которая носит название «пушдауна предикатов» (predicate pushdown), удаётся значительно снизить объём данных, передаваемых от источника к движку обработки федеративных запросов. Благодаря этому снижается нагрузка на сеть и экономятся вычислительные ресурсы YDB.

   Частный случай пушдауна предикатов, при котором выполняется передача фильтрующих выражений, указанных после ключевого слова `WHERE`, называется «пушдауном фильтров» (filter pushdown). Пушдаун фильтров возможен при использовании:

   |Описание|Пример|
   |---|---|
   |Фильтров вида `IS NULL`/`IS NOT NULL`|`WHERE column1 IS NULL` или `WHERE column1 IS NOT NULL`|
   |Логических условий `OR`, `NOT`, `AND`. |`WHERE column IS NULL OR column2 is NOT NULL`.|
   |Условий сравнения `=`, `<>`, `<`, `<=`, `>`, `>=` c другими колонками или константами. |`WHERE column3 > column4 OR column5 <= 10`.|

   Поддерживаемые типы данных для пушдауна фильтров:
   <!-- endsource: ru/concepts/query_execution/federated_query/_includes/predicate_pushdown.md -->

    |Тип данных YDB|
    |----|
    |`Bool`|
    |`Int8`|
    |`Int16`|
    |`Int32`|
    |`Int64`|
    |`Float`|
    |`Double`|

## Поддерживаемые типы данных

В базе данных Microsoft SQL Server признак опциональности значений колонки (разрешено или запрещено колонке содержать значения `NULL`) не является частью системы типов данных. Ограничение (constraint) `NOT NULL` для любой колонки любой таблицы хранится в виде значения столбца `IS_NULLABLE` системной таблицы [INFORMATION_SCHEMA.COLUMNS](https://learn.microsoft.com/ru-ru/sql/relational-databases/system-information-schema-views/columns-transact-sql?view=sql-server-ver16), то есть на уровне метаданных таблицы. Следовательно, все базовые типы Microsoft SQL Server по умолчанию могут содержать значения `NULL`, и в системе типов YDB они должны отображаться в [опциональные](https://ydb.tech/docs/ru/yql/reference/types/optional.md?version=v25.3) типы.

Ниже приведена таблица соответствия типов Microsoft SQL Server и YDB. Все остальные типы данных, за исключением перечисленных, не поддерживаются.

|Тип данных Microsoft SQL Server|Тип данных YDB|Примечания|
|---|----|------|
|`bit`|`Optional<Bool>`||
|`tinyint`|`Optional<Int8>`||
|`smallint`|`Optional<Int16>`||
|`int`|`Optional<Int32>`||
|`bigint`|`Optional<Int64>`||
|`real`|`Optional<Float>`||
|`float`|`Optional<Double>`||
|`date`|`Optional<Date>`|Допустимый диапазон дат с 1970-01-01 и до 2105-12-31. При выходе значения за границы диапазона возвращается `NULL`.|
|`smalldatetime`|`Optional<Datetime>`|Допустимый диапазон времени с 1970-01-01 00:00:00 и до 2105-12-31 23:59:59. При выходе значения за границы диапазона возвращается значение `NULL`.|
|`datetime`|`Optional<Timestamp>`|Допустимый диапазон времени с 1970-01-01 00:00:00 и до 2105-12-31 23:59:59. При выходе значения за границы диапазона возвращается значение `NULL`.|
|`datetime2`|`Optional<Timestamp>`|Допустимый диапазон времени с 1970-01-01 00:00:00 и до 2105-12-31 23:59:59. При выходе значения за границы диапазона возвращается значение `NULL`.|
|`binary`|`Optional<String>`||
|`varbinary`|`Optional<String>`||
|`image`|`Optional<String>`||
|`char`|`Optional<Utf8>`||
|`varchar`|`Optional<Utf8>`||
|`text`|`Optional<Utf8>`||
|`nchar`|`Optional<Utf8>`||
|`nvarchar`|`Optional<Utf8>`||
|`ntext`|`Optional<Utf8>`||
