+++
title = "Майкрософт SQL Server"
description = "Руководство по использованию Microsoft SQL Server в Harvest"
keywords = ["harvest", "MSSQL", "Microsoft", "SQL", "guide", "Azure SQL Database"]
aliases = ["/docs/harvest/latest/features/datasources/mssql/"]
weight = 900
+++
# Использование Microsoft SQL Server в Harvest

Harvest поставляется со встроенным подключаемым модулем источника данных Microsoft SQL Server (MS SQL), который позволяет запрашивать и визуализировать данные из любого Microsoft SQL Server 2005 или новее, включая базу данных Microsoft Azure SQL. В этом разделе объясняются параметры, переменные, запросы и другие параметры, характерные для источника данных MS SQL. См. [Добавить источник данных]({{< relref "add-a-data-source.md" >}}) для получения инструкций о том, как добавить источник данных в Harvest. Добавлять источники данных могут только пользователи с ролью администратора организации.

## Параметры источника данных

Чтобы получить доступ к настройкам источника данных, наведите указатель мыши на значок **Конфигурация** (шестеренка), затем нажмите **Источники данных**, а затем щелкните источник данных.

| Имя              | Описание                                                                                                                         |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `Name`           | Имя источника данных. Именно так вы обращаетесь к источнику данных в панелях и запросах.                                               |
| `Default`        | Источник данных по умолчанию означает, что он будет предварительно выбран для новых панелей.                                                             |
| `Host`           | IP-адрес/имя хоста и необязательный порт вашего экземпляра MS SQL. Если порт не указан, будет использоваться драйвер по умолчанию (0).     |
| `Database`       |Имя вашей базы данных MS SQL.                                                                                                        |
| `Authentication` |Режим аутентификации. Либо с использованием проверки подлинности SQL Server, либо проверки подлинности Windows (единый вход для пользователей Windows).           |
| `User`           | Логин/имя пользователя базы данных                                                                                                       |
| `Password`       | Пароль пользователя базы данных                                                                                                         |
| `Encrypt`        | Этот параметр определяет, будет ли и в какой степени безопасное соединение SSL TCP/IP согласовываться с сервером, по умолчанию «false».|
| `Max open`       | Максимальное количество открытых подключений к базе данных, по умолчанию «неограничено».                                                        |
| `Max idle`       | Максимальное количество подключений в пуле незанятых подключений, по умолчанию 2.                                                           |
| `Max lifetime`   | Максимальное количество времени в секундах, в течение которого соединение может быть повторно использовано, по умолчанию `14400`/4 часа.                                           |

### Минимальный временной интервал

Нижний предел для [$__interval]({{< relref "../variables/variable-types/_index.md#the-interval-variable" >}}) и [$__interval_ms]({{< relref ". ./variables/variable-types/_index.md#the-interval-ms-variable" >}}) переменных.
Рекомендуется установить частоту записи, например `1m`, если ваши данные записываются каждую минуту.
Этот параметр также можно переопределить/настроить на панели инструментов в разделе параметров источника данных. Важно отметить, что это значение **должно** быть отформатировано как
число, за которым следует действительный идентификатор времени, например. `1m` (1 минута) или `30s` (30 секунд). Поддерживаются следующие идентификаторы времени:
| Идентификатор | Описание |
| ---------- | ----------- |
| `y`        |год       |
| `M`        | месяц       |
| `w`        | неделя       |
| `d`        | день         |
| `h`        |час      |
| `m`        | минута     |
| `s`        | секунда     |
| `ms`       | миллисекунда |

### Разрешения пользователя базы данных

Пользователю базы данных, которого вы укажете при добавлении источника данных, должны быть предоставлены разрешения SELECT только на
указанную базу данных и таблицы, которые вы хотите запросить. Harvest не проверяет безопасность запроса. Запрос
может включать любой оператор SQL. Например, такие операторы, как `DELETE FROM user` и `DROP TABLE user`, будут
казнен. Для защиты от этого мы _настоятельно_ рекомендуем создать отдельного пользователя MS SQL с ограниченными правами.

Пример:

```sql
 CREATE USER harvestreader WITH PASSWORD 'password'
 GRANT SELECT ON dbo.YourTable3 TO harvestreader
```
Убедитесь, что пользователь не получает нежелательных привилегий от общедоступной роли.

### Известные вопросы

Если вы используете более старую версию Microsoft SQL Server, например 2008 и 2008R2, вам может потребоваться отключить шифрование, чтобы иметь возможность подключения.
Если возможно, мы рекомендуем вам использовать последний доступный пакет обновления для оптимальной совместимости.

## Редактор запросов

{{< Figure src="/static/img/docs/v51/mssql_query_editor.png" class="docs-image--no-shadow" >}}

Вы найдете редактор запросов MSSQL на вкладке метрик в режиме редактирования панели Graph, Singlestat или Table. Вы входите в режим редактирования, нажав кнопку
название панели, затем отредактируйте. Редактор позволяет определить SQL-запрос для выбора данных для визуализации.

1. Выберите _Format as_ «Временные ряды» (для использования, среди прочего, в панели «График» или «Единая статистика») или «Таблица» (для использования, среди прочего, в панели «Таблица»).
1. Это настоящий редактор, в котором вы пишете свои SQL-запросы.
1. Показать раздел справки для MSSQL под редактором запросов.
1. Показать фактически выполненный SQL-запрос. Будет доступен первым после успешного выполнения запроса.
1. Добавьте дополнительный запрос, в котором будет отображаться дополнительный редактор запросов.

<div class="clearfix"></div>

## Макросы

Чтобы упростить синтаксис и разрешить динамические части, такие как фильтры диапазона дат, запрос может содержать макросы.

| Пример макроса                                         | Описание                                                                                                                                                                                                                                                                             |
| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `$__time(dateColumn)`                                 | Будет заменено выражением для переименования столбца в _time_. Например, _dateColumn как время_                                                                                                                                                                                         |
| `$__timeEpoch(dateColumn)`                            | Будет заменено выражением для преобразования типа столбца DATETIME в отметку времени Unix и переименования его в _time_. <br/>Например, _DATEDIFF(секунда, '1970-01-01', dateColumn) КАК время_                                                                                                  |
| `$__timeFilter(dateColumn)`                           |Будет заменен фильтром временного диапазона, использующим указанное имя столбца. <br/>Например, _dateColumn МЕЖДУ «2017-04-21T05:01:17Z» И «2017-04-21T05:06:17Z»_                                                                                                                          |
| `$__timeFrom()`                                       | Будет заменено началом текущего активного выбора времени. Например, _'2017-04-21T05:01:17Z'_                                                                                                                                                                               |
| `$__timeTo()`                                         | Будет заменено к концу текущего активного выбора времени. Например, _'2017-04-21T05:06:17Z'_                                                                                                                                                                                  |
| `$__timeGroup(dateColumn,'5m'[, fillvalue])`          | Будет заменено выражением, которое можно использовать в предложении GROUP BY. Предоставление _fillValue_ значения _NULL_ или _плавающего значения_ автоматически заполнит пустую серию во временном диапазоне этим значением. <br/>Например, _CAST(ROUND(DATEDIFF(second, '1970-01-01', time_column)/300.0, 0) as bigint)\*300_. |
| `$__timeGroup(dateColumn,'5m', 0)`                    | То же, что и выше, но с параметром заполнения, поэтому недостающие точки в этой серии будут добавлены графаной, а 0 будет использоваться в качестве значения.                                                                                                                                                            |
| `$__timeGroup(dateColumn,'5m', NULL)`                 | То же, что и выше, но NULL будет использоваться как значение для отсутствующих точек.                                                                                                                                                                                                                            |
| `$__timeGroup(dateColumn,'5m', previous)`             |То же, что и выше, но предыдущее значение в этой серии будет использоваться в качестве значения заполнения, если значение не было видно, но будет использоваться NULL (доступно только в Harvest 5.3+).                                                                                                                           |
| `$__timeGroupAlias(dateColumn,'5m')`                  | Будет заменено идентично \$\_\_timeGroup, но с добавленным псевдонимом столбца (доступно только в Harvest 5.3+).                                                                                                                                                                           |
| `$__unixEpochFilter(dateColumn)`                      |Будет заменен фильтром временного диапазона с использованием указанного имени столбца со временем, представленным в виде временной метки Unix. Например, _dateColumn > 1494410783 AND dateColumn < 1494497183_                                                                                                    |
| `$__unixEpochFrom()`                                  |Будет заменено началом текущего активного выбора времени в виде временной метки Unix. Например, _1494410783_                                                                                                                                                                           |
| `$__unixEpochTo()`                                    | Будет заменено окончанием текущего активного выбора времени в виде временной метки Unix. Например, _1494497183_                                                                                                                                                             |
| `$__unixEpochNanoFilter(dateColumn)`                  |Будет заменен фильтром временного диапазона с использованием указанного имени столбца со временем, представленным в виде отметки времени в наносекундах. Например, _dateColumn > 1494410783152415214 AND dateColumn < 1494497183142514872_                                                                          |
| `$__unixEpochNanoFrom()`                              | Будет заменено началом текущего активного выбора времени в виде отметки времени в наносекундах. Например, _1494410783152415214_                                                                                                                                                          |
| `$__unixEpochNanoTo()`                                |Будет заменено концом текущего активного выбора времени в виде отметки времени в наносекундах. Например, _1494497183142514872_                                                                                                                                              |
| `$__unixEpochGroup(dateColumn,'5m', [fillmode])`      | То же, что и \$\_\_timeGroup, но для времени, хранящегося как временная метка Unix (доступно только в Harvest 5.3+).                                                                                                                                                                                         |
| `$__unixEpochGroupAlias(dateColumn,'5m', [fillmode])` |То же, что и выше, но также добавляет псевдоним столбца (доступно только в Harvest 5.3+).                                                                                                                                                                                                            |

Мы планируем добавить еще много макросов. Если у вас есть предложения по макросам, которые вы хотели бы видеть, [откройте вопрос] (https://github.com/harvest/harvest) в нашем репозитории GitHub.

В редакторе запросов есть ссылка «Сгенерированный SQL», которая появляется после выполнения запроса в режиме редактирования панели. Нажмите на нее, и она развернется и покажет необработанную интерполированную строку SQL, которая была выполнена.

## Табличные запросы

Если для параметра запроса «Форматировать как» установлено значение «Таблица», вы можете выполнять любой тип SQL-запроса. Панель таблицы автоматически покажет результаты любых столбцов и строк, возвращаемых вашим запросом.

**Пример таблицы базы данных:**
```sql
CREATE TABLE [event] (
  time_sec bigint,
  description nvarchar(100),
  tags nvarchar(100),
)
```

```sql
CREATE TABLE [mssql_types] (
  c_bit bit, c_tinyint tinyint, c_smallint smallint, c_int int, c_bigint bigint, c_money money, c_smallmoney smallmoney, c_numeric numeric(10,5),
  c_real real, c_decimal decimal(10,2), c_float float,
  c_char char(10), c_varchar varchar(10), c_text text,
  c_nchar nchar(12), c_nvarchar nvarchar(12), c_ntext ntext,
  c_datetime datetime,  c_datetime2 datetime2, c_smalldatetime smalldatetime, c_date date, c_time time, c_datetimeoffset datetimeoffset
)

INSERT INTO [mssql_types]
SELECT
  1, 5, 20020, 980300, 1420070400, '$20000.15', '£2.15', 12345.12,
  1.11, 2.22, 3.33,
  'char10', 'varchar10', 'text',
  N'☺nchar12☺', N'☺nvarchar12☺', N'☺text☺',
  GETDATE(), CAST(GETDATE() AS DATETIME2), CAST(GETDATE() AS SMALLDATETIME), CAST(GETDATE() AS DATE), CAST(GETDATE() AS TIME), SWITCHOFFSET(CAST(GETDATE() AS DATETIMEOFFSET), '-07:00')
```

редактор запросов с примером запроса:
{{< figure src="/static/img/docs/v51/mssql_table_query.png" max-width="500px" class="docs-image--no-shadow" >}}

Запрос:

```sql
SELECT * FROM [mssql_types]
```

Вы можете управлять именами столбцов панели «Таблица», используя обычный синтаксис выбора столбца «AS» SQL. Пример:

```sql
SELECT
  c_bit as [column1], c_tinyint as [column2]
FROM
  [mssql_types]
```
Результирующая табличная панель:

{{< figure src="/static/img/docs/v51/mssql_table_result.png" max-width="1489px" class="docs-image--no-shadow" >}}

## Запросы временных рядов

Если вы установите «Форматировать как» на «Временной ряд», например, для использования на панели «График», тогда запрос должен иметь столбец с именем «время», который возвращает либо дату и время SQL, либо любой числовой тип данных, представляющий эпоху Unix в секундах. Вы можете вернуть столбец с именем `metric`, который используется в качестве имени метрики для столбца значений. Любой столбец, кроме «время» и «метрика», рассматривается как столбец значений. Если вы опустите столбец `метрика`, имя столбца значения будет именем метрики. Вы можете выбрать несколько столбцов значений, каждый из которых будет иметь свое имя в качестве метрики.
Если вы возвращаете несколько столбцов значений и столбец с именем «метрика», то этот столбец используется в качестве префикса для имени серии (доступно только в Harvest 5.3+).

Наборы результатов запросов временных рядов должны быть отсортированы по времени.

**Пример таблицы базы данных:**

```sql
CREATE TABLE [event] (
  time_sec bigint,
  description nvarchar(100),
  tags nvarchar(100),
)
```

```sql
CREATE TABLE metric_values (
  time datetime,
  measurement nvarchar(100),
  valueOne int,
  valueTwo int,
)

INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 12:30:00', 'Metric A', 62, 6)
INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 12:30:00', 'Metric B', 49, 11)
...
INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 13:55:00', 'Metric A', 14, 25)
INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 13:55:00', 'Metric B', 48, 10)

```

{{< figure src="/static/img/docs/v51/mssql_time_series_one.png" class="docs-image--no-shadow docs-image--right" >}}

**Пример с одним столбцом "значение" и одним столбцом "метрика".**

```sql
SELECT
  time,
  valueOne,
  measurement as metric
FROM
  metric_values
WHERE
  $__timeFilter(time)
ORDER BY 1
```

Wкогда приведенный выше запрос используется на панели графика, он создает два ряда с именами «Метрика A» и «Метрика B» со значениями «valueOne» и «valueTwo», построенными в течение «времени».

<div class="clearfix"></div>

{{< Figure src="/static/img/docs/v51/mssql_time_series_two.png" class="docs-image--no-shadow docs-image--right" >}}

**Пример с несколькими столбцами значения:**

```sql
SELECT
  time,
  valueOne,
  valueTwo
FROM
  metric_values
WHERE
  $__timeFilter(time)
ORDER BY 1
```
Когда приведенный выше запрос используется на панели графика, он создает два ряда с именами «Метрика A» и «Метрика B» со значениями «valueOne» и «valueTwo», построенными в течение «времени».

<div class="clearfix"></div>

{{< Figure src="/static/img/docs/v51/mssql_time_series_three.png" class="docs-image--no-shadow docs-image--right" >}}

**Пример использования макроса \$\_\_timeGroup:**
```sql
SELECT
  $__timeGroup(time, '3m') as time,
  measurement as metric,
  avg(valueOne)
FROM
  metric_values
WHERE
  $__timeFilter(time)
GROUP BY
  $__timeGroup(time, '3m'),
  measurement
ORDER BY 1
```

Когда приведенный выше запрос используется на панели графика, он создает два ряда с именами «Метрика A» и «Метрика B» со значениями «valueOne» и «valueTwo», построенными в течение «времени».
Любые две серии, не имеющие значения в трехминутном окне, отобразят линию между этими двумя строками. Вы заметите, что график справа никогда не опускается до нуля.

<div class="clearfix"></div>

{{< Figure src="/static/img/docs/v51/mssql_time_series_four.png" class="docs-image--no-shadow docs-image--right" >}}

**Пример использования макроса \$\_\_timeGroup с нулевым параметром заполнения:**

```sql
SELECT
  $__timeGroup(time, '3m', 0) as time,
  measurement as metric,
  sum(valueTwo)
FROM
  metric_values
WHERE
  $__timeFilter(time)
GROUP BY
  $__timeGroup(time, '3m'),
  measurement
ORDER BY 1
```

Когда приведенный выше запрос используется на панели графика, результатом являются два ряда с именами «Метрика A» и «Метрика B» с суммой «valueTwo», построенной за «время».
Любая серия, не имеющая значения в 3-минутном окне, будет иметь нулевое значение, которое вы увидите на графике справа.

## Шаблоны

Вместо жесткого кодирования таких вещей, как имя сервера, приложения и датчика в ваших метрических запросах, вы можете использовать вместо них переменные. Переменные отображаются в виде раскрывающегося списка в верхней части панели инструментов. Эти раскрывающиеся списки упрощают изменение данных, отображаемых на панели инструментов.

Ознакомьтесь с документацией [Templating]({{< relref "../variables/_index.md" >}}) для ознакомления с функцией шаблонов и различными типами переменных шаблонов.

### Переменная запроса

Если вы добавите переменную шаблона типа `Query`, вы можете написать запрос MS SQL, который может
возвращать такие вещи, как имена измерений, имена ключей или значения ключей, которые отображаются в виде раскрывающегося списка.

Например, у вас может быть переменная, содержащая все значения для столбца `hostname` в таблице, если вы укажете подобный запрос в настройке переменной шаблона **Query**.

```sql
SELECT hostname FROM host
```

Запрос может возвращать несколько столбцов, и Harvest автоматически создаст из них список. Например, приведенный ниже запрос вернет список со значениями из `hostname` и `hostname2`.

```sql
SELECT [host].[hostname], [other_host].[hostname2] FROM host JOIN other_host ON [host].[city] = [other_host].[city]
```

Другой вариант — это запрос, который может создать переменную ключ/значение. Запрос должен вернуть два столбца с именами __text и __value. Значение столбца `__text` должно быть уникальным (если оно не уникально, то используется первое значение). Параметры в раскрывающемся списке будут иметь текст и значение, которые позволят вам использовать понятное имя в виде текста и идентификатор в качестве значения. Пример запроса с `hostname` в качестве текста и `id` в качестве значения:

```sql
SELECT hostname __text, id __value FROM host
```
Вы также можете создавать вложенные переменные. Например, если у вас есть другая переменная с именем `region`. Тогда вы могли бы
переменная hosts показывает только хосты из текущего выбранного региона с таким запросом (если `region` является переменной с несколькими значениями, тогда используйте оператор сравнения `IN`, а не `=` для сопоставления с несколькими значениями):
```sql
SELECT hostname FROM host WHERE region IN ($region)
```

### Использование переменных в запросах

> Начиная с Harvest 4.3.0 и 4.6.0, переменные шаблона всегда автоматически заключаются в кавычки, поэтому, если это строковое значение, не заключайте их в кавычки в предложениях where.
>
> Начиная с Harvest 5.0.0, значения переменных шаблона заключаются в кавычки только в том случае, если переменная шаблона является «многозначной».

Если переменная является переменной с несколькими значениями, используйте оператор сравнения `IN`, а не `=` для сопоставления с несколькими значениями.

Есть два синтаксиса:

`$<varname>` Пример с переменной шаблона с именем `hostname`:

```sql
SELECT
  atimestamp time,
  aint value
FROM table
WHERE $__timeFilter(atimestamp) and hostname in($hostname)
ORDER BY atimestamp
```

`[[varname]]` Пример с переменной шаблона с именем `hostname`:

```sql
SELECT
  atimestamp as time,
  aint as value
FROM table
WHERE $__timeFilter(atimestamp) and hostname in([[hostname]])
ORDER BY atimestamp
```
## Отключение кавычек для многозначных переменных

Harvest автоматически создает строку в кавычках, разделенную запятыми, для многозначных переменных. Например: если выбраны `server01` и `server02`, они будут отформатированы как: `'server01', 'server02'`. Отключите цитирование, используйте параметр форматирования csv для переменных:

`${servers:csv}`

Read more about variable formatting options in the [Variables]({{< relref "../variables/variable-types/_index.md#advanced-formatting-options" >}}) documentation.

## Annotations

[Annotations]({{< relref "../dashboards/annotations.md" >}}) allow you to overlay rich event information on top of graphs. You add annotation queries via the Dashboard menu / Annotations view.
Подробнее об опциях форматирования читайте в документации [Переменные]({{< relref "../variables/variable-types/_index.md#advanced-formatting-options" >}}).

## Аннотации

[Аннотации]({{< relref "../dashboards/annotations.md" >}}) позволяют накладывать расширенную информацию о событиях поверх графиков. Вы производите запросы аннотаций через меню Dashboard/представление Annotations.
**Columns:**

| Имя      | Описание                                                                                                                      |
| --------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `time`    | Имя поля даты/времени. Может быть столбцом с собственным типом данных даты/времени SQL или значением эпохи.                       |
| `timeend` | Необязательное имя поля даты/времени окончания. Может быть столбцом с собственным типом данных даты/времени SQL или значением эпохи. (Harvest v6.6+) |
| `text`    | Поле описания события.                                                                                                       |
| `tags`    | Необязательное имя поля для использования в тегах событий в виде строки, разделенной запятыми.                                                          |

**Примеры таблиц базы данных:**

```sql
CREATE TABLE [events] (
  time_sec bigint,
  description nvarchar(100),
  tags nvarchar(100),
)
```

Мы также используем таблицу базы данных, определенную в [Запросы временных рядов](#time-series-queries).

**Пример запроса с использованием столбца времени со значениями эпохи:**

```sql
SELECT
  time_sec as time,
  description as [text],
  tags
FROM
  [events]
WHERE
  $__unixEpochFilter(time_sec)
ORDER BY 1
```

**Пример запроса региона с использованием столбцов time и timeend со значениями эпохи:**

> Доступно только в Harvest v6.6+.

```sql
SELECT
  time_sec as time,
  time_end_sec as timeend,
  description as [text],
  tags
FROM
  [events]
WHERE
  $__unixEpochFilter(time_sec)
ORDER BY 1
```

**Пример запроса с использованием столбца времени собственного типа данных даты/времени SQL:**

```sql
SELECT
  time,
  measurement as text,
  convert(varchar, valueOne) + ',' + convert(varchar, valueTwo) as tags
FROM
  metric_values
WHERE
  $__timeFilter(time_column)
ORDER BY 1
```
## Поддержка хранимых процедур

Хранимые процедуры проверены на работоспособность. Однако обратите внимание, что мы не сделали ничего особенного для поддержки этого, поэтому могут быть крайние случаи, когда это не будет работать так, как вы ожидаете.
Хранимые процедуры должны поддерживаться в запросах таблиц, временных рядов и аннотаций, если вы используете те же имена столбцов и возвращаете данные в том же формате, как описано выше в соответствующем разделе.

Обратите внимание, что ни одна функция макроса не будет работать внутри хранимой процедуры.

### Примеры

{{< Figure src="/static/img/docs/v51/mssql_metrics_graph.png" class="docs-image--no-shadow docs-image--right" >}}
В следующих примерах таблица базы данных определяется в [Запросы временных рядов](#time-series-queries). Допустим, мы хотим визуализировать четыре ряда на панели графика, например, все комбинации столбцов `valueOne`, `valueTwo` и `measurement`. Панель графиков справа визуализирует то, чего мы хотим достичь. Чтобы решить эту проблему, нам нужно использовать два запроса:

**Первый запрос:**

```sql
SELECT
  $__timeGroup(time, '5m') as time,
  measurement + ' - value one' as metric,
  avg(valueOne) as valueOne
FROM
  metric_values
WHERE
  $__timeFilter(time)
GROUP BY
  $__timeGroup(time, '5m'),
  measurement
ORDER BY 1
```

**Второй запрос:**

```sql
SELECT
  $__timeGroup(time, '5m') as time,
  measurement + ' - value two' as metric,
  avg(valueTwo) as valueTwo
FROM
  metric_values
GROUP BY
  $__timeGroup(time, '5m'),
  measurement
ORDER BY 1
```
#### Хранимая процедура, использующая время в формате эпохи

Мы можем определить хранимую процедуру, которая будет возвращать все данные, необходимые для отображения 4 серий на панели графика, как показано выше.
В этом случае хранимая процедура принимает два параметра `@from` и `@to` типа данных `int`, которые должны быть диапазоном времени (от-до) в формате эпохи.
который будет использоваться для фильтрации данных, возвращаемых хранимой процедурой.

Мы имитируем `$__timeGroup(time, '5m')` в выражениях select и group by, и поэтому требуется много длинных выражений -
при желании их можно извлечь в функции MS SQL.
```sql
CREATE PROCEDURE sp_test_epoch(
  @from int,
  @to 	int
)	AS
BEGIN
  SELECT
    cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int) as time,
    measurement + ' - value one' as metric,
    avg(valueOne) as value
  FROM
    metric_values
  WHERE
    time >= DATEADD(s, @from, '1970-01-01') AND time <= DATEADD(s, @to, '1970-01-01')
  GROUP BY
    cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int),
    measurement
  UNION ALL
  SELECT
    cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int) as time,
    measurement + ' - value two' as metric,
    avg(valueTwo) as value
  FROM
    metric_values
  WHERE
    time >= DATEADD(s, @from, '1970-01-01') AND time <= DATEADD(s, @to, '1970-01-01')
  GROUP BY
    cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int),
    measurement
  ORDER BY 1
END
```

Затем мы можем использовать следующий запрос для нашей панели графика.

```sql
DECLARE
  @from int = $__unixEpochFrom(),
  @to int = $__unixEpochTo()

EXEC dbo.sp_test_epoch @from, @to
```
#### Хранимая процедура, использующая время в формате datetime

Мы можем определить хранимую процедуру, которая будет возвращать все данные, необходимые для отображения 4 серий на панели графика, как показано выше.
В этом случае хранимая процедура принимает два параметра `@from` и `@to` типов данных `datetime`, которые должны быть диапазоном времени (от-до).
который будет использоваться для фильтрации данных, возвращаемых хранимой процедурой.

Мы имитируем `$__timeGroup(time, '5m')` в выражениях выбора и группировки по выражениям, и поэтому требуется много длинных выражений -
при желании их можно извлечь в функции MS SQL.

```sql
CREATE PROCEDURE sp_test_datetime(
  @from datetime,
  @to 	datetime
)	AS
BEGIN
  SELECT
    cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int) as time,
    measurement + ' - value one' as metric,
    avg(valueOne) as value
  FROM
    metric_values
  WHERE
    time >= @from AND time <= @to
  GROUP BY
    cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int),
    measurement
  UNION ALL
  SELECT
    cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int) as time,
    measurement + ' - value two' as metric,
    avg(valueTwo) as value
  FROM
    metric_values
  WHERE
    time >= @from AND time <= @to
  GROUP BY
    cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int),
    measurement
  ORDER BY 1
END

```

Затем мы можем использовать следующий запрос для нашей панели графика.

```sql
DECLARE
  @from datetime = $__timeFrom(),
  @to datetime = $__timeTo()

EXEC dbo.sp_test_datetime @from, @to
```
## Оповещение

Запросы временных рядов должны работать в условиях оповещения. Запросы в формате таблицы еще не поддерживаются в правиле предупреждений.
условия.

## Настройте источник данных с предоставлением

Теперь можно настраивать источники данных с помощью конфигурационных файлов в системе обеспечения Harvest. Вы можете узнать больше о том, как это работает, и обо всех настройках, которые вы можете установить для источников данных, на [странице документации по подготовке]({{< relref "../administration/provisioning/#datasources" >}})

Вот несколько примеров подготовки для этого источника данных.
```yaml
apiVersion: 1

datasources:
  - name: MSSQL
    type: mssql
    url: localhost:1433
    database: harvest
    user: harvest
    jsonData:
      maxOpenConns: 0 # Harvest v5.4+
      maxIdleConns: 2 # Harvest v5.4+
      connMaxLifetime: 14400 # Harvest v5.4+
    secureJsonData:
      password: 'Password!'
```
