Последнее обновление: августа 10, 2026

Редактор запросов Microsoft SQL Server

Редактор запросов MSSQL позволяет писать запросы Transact-SQL прямо в Grafana, со встроенными макросами и параметрами форматирования, предназначенными для визуализаций временных рядов и таблиц. Вы можете открыть его из Explore или из любой панели дашборда в режиме редактирования.

Эта страница охватывает функции запросов, специфичные для MSSQL. Общие концепции запросов, применимые ко всем источникам данных, см. в разделе Query and transform data. Синтаксис Transact-SQL см. в разделах Write Transact-SQL statements и Transact-SQL reference в документации Microsoft.

Редактор запросов Microsoft SQL Server имеет два режима:

Чтобы переключаться между режимами редактора, выберите соответствующие вкладки Builder и Code в правом верхнем углу.

Построитель запросов MSSQL

Warning

При переключении из режима Code в режим Builder любые изменения, внесённые в ваш SQL-запрос, не сохраняются и не отображаются в интерфейсе построителя. Вы можете скопировать свой код в буфер обмена или отменить изменения.

Чтобы выполнить запрос, выберите Run query в правом верхнем углу редактора.

Помимо написания запросов, редактор запросов также позволяет создавать и использовать:

Режим Builder

Режим Builder позволяет строить запросы с помощью визуального интерфейса. Этот режим отлично подходит пользователям, которые предпочитают управляемый процесс создания запросов или только начинают работать с SQL.

MSSQL builder mode>

Следующие компоненты помогают вам построить запрос T-SQL:

  • Format - Выберите формат ответа из выпадающего списка для запроса MSSQL. По умолчанию — Table. Дополнительную информацию и примеры см. в разделах Табличные запросы и Запросы временных рядов. Если вы выберете вариант формата Time series, необходимо включить столбец time.

  • Dataset - Выберите базу данных для запроса из выпадающего списка. Grafana автоматически заполняет выпадающий список всеми базами данных, к которым у пользователя есть доступ. Если база данных задана в поле Database на странице настройки источника данных или через файл провижининга, пользователи ограничены запросами только к этой базе данных.

    Обратите внимание, что системные базы данных tempdb, model, msdb и master не включены в выпадающий список редактора запросов.

  • Table - Выберите таблицу из выпадающего списка. После выбора базы данных следующий выпадающий список отображает все доступные таблицы в этой базе данных.

  • Data operations - Необязательно. Выберите агрегацию или макрос из выпадающего списка. Вы можете добавить несколько операций с данными, нажав знак +. Нажмите значок мусорной корзины, чтобы удалить операции с данными.

    • Column - Выберите столбец, по которому следует выполнить агрегацию.
    • Interval - Выберите интервал из выпадающего списка. Вы увидите эту опцию, когда выберете макрос time group из выпадающего списка.
    • Fill - Необязательно. Добавьте метод FILL, чтобы заполнить отсутствующие временные интервалы значениями по умолчанию (например, NULL, 0 или указанным значением), когда для этих интервалов нет данных. Это обеспечивает непрерывность временного ряда, избегая разрывов в визуализациях.
    • Alias - Необязательно. Добавьте псевдоним из выпадающего списка. Вы также можете добавить собственный псевдоним, введя его в поле и нажав Enter. Удалите псевдоним, нажав X.
  • Filter - Переключите, чтобы добавить фильтры.

    • Filter by column value - Необязательно. Если вы включите Filter, вы сможете добавить столбец для фильтрации из выпадающего списка. Чтобы фильтровать по дополнительным столбцам, нажмите знак + справа от выпадающего списка условий. Вы можете выбрать различные операторы из выпадающего списка рядом с условием. Когда добавлено несколько фильтров, используйте операторы AND или OR, чтобы определить, как оцениваются условия. AND требует, чтобы все условия были истинными, тогда как OR требует, чтобы любое условие было истинным. Используйте второй выпадающий список для выбора значения фильтра. Чтобы удалить фильтр, нажмите значок X рядом с ним. Если вы выберете столбец типа date-type, вы можете использовать макросы из списка операторов и выбрать timeFilter, чтобы вставить макрос $\_\_timeFilter в ваш запрос с выбранным столбцом даты.

      После выбора столбца типа даты вы можете выбрать Macros из списка операторов и выбрать timeFilter, что добавит макрос $\_\_timeFilter в запрос с выбранным столбцом даты. Дополнительную информацию см. в разделе Макросы.

  • Group - Переключите, чтобы добавить столбец GROUP BY.

    • Group by column - Выберите столбец для фильтрации из выпадающего списка. Нажмите знак +, чтобы фильтровать по нескольким столбцам. Нажмите X, чтобы удалить фильтр.
  • Order - Переключите, чтобы добавить инструкцию ORDER BY.

    • Order by - Выберите столбец для сортировки из выпадающего списка. Выберите порядок по возрастанию (ASC) или по убыванию (DESC).
    • Limit - Вы можете добавить необязательное ограничение на количество извлекаемых результатов. По умолчанию — 50.
  • Preview - Переключите, чтобы увидеть предварительный просмотр SQL-запроса, сгенерированного построителем запросов. Предварительный просмотр включён по умолчанию.

Дополнительные сведения об использовании форматов см. в разделах Табличные запросы и Запросы временных рядов.

Режим Code

Режим Code позволяет строить сложные запросы с помощью текстового редактора с полезными функциями, такими как автодополнение и подсветка синтаксиса.

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

Функции панели инструментов режима Code

Режим Code имеет несколько функций на панели инструментов, расположенной в правом нижнем углу редактора.

  • Чтобы переформатировать запрос, нажмите кнопку скобок ({}).
  • Чтобы развернуть редактор кода, нажмите кнопку в виде шеврона, направленного вниз.
  • Чтобы выполнить запрос, нажмите кнопку Run query или используйте сочетание клавиш Ctrl/Cmd + Enter/Return.

Использование автодополнения

Функция автодополнения режима Code работает автоматически во время ввода. Чтобы вызвать автодополнение вручную, используйте сочетание клавиш Ctrl/Cmd + Space.

Режим Code поддерживает автодополнение таблиц, столбцов, ключевых слов SQL, стандартных функций SQL, переменных шаблонов Grafana и макросов Grafana.

Note

Вы не можете автодополнять столбцы, пока не указали таблицу.

Макросы

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

Используйте макросы в предложении SELECT, чтобы упростить создание запросов временных рядов. В выпадающем списке Data operations выберите макрос, например $\_\_timeGroup или $\_\_timeGroupAlias. Затем выберите столбец времени из выпадающего списка Column и временной интервал из выпадающего списка Interval. Это создаёт запрос временного ряда на основе выбранной вами группировки по времени.

Warning

Макросы времени ($__time, $__timeFilter и т. д.) не поддерживают параметры часового пояса в Microsoft SQL Server и всегда разворачиваются в значения UTC. Если ваши временные метки не хранятся в UTC (что часто бывает с типами datetime/datetime2), преобразуйте их в UTC в вашем SQL-запросе с помощью AT TIME ZONE … AT TIME ZONE 'UTC', а не передавайте аргумент часового пояса в макрос.

Макрос Описание
$__time(dateColumn) Переименовывает указанный столбец в _time. Пример: dateColumn AS time
$__timeEpoch(dateColumn) Преобразует столбец DATETIME в метку времени Unix и переименовывает его в _time. Пример: DATEDIFF(second, '1970-01-01', dateColumn) AS time
$__timeFilter(dateColumn) Добавляет фильтр диапазона времени для указанного столбца. Пример: dateColumn BETWEEN '2017-04-21T05:01:17Z' AND '2017-04-21T05:06:17Z'
$__timeFrom() Возвращает начало текущего диапазона времени. Пример: '2017-04-21T05:01:17Z'
$__timeTo() Возвращает конец текущего диапазона времени. Пример: '2017-04-21T05:06:17Z'
$__timeGroup(dateColumn, '5m'[, fillValue]) Группирует указанный столбец времени в интервалы (например, 5 минут). При необходимости заполняет пробелы значением, таким как 0, NULL или previous. Пример: 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.
$__timeGroupAlias(dateColumn, '5m') То же, что $__timeGroup, но также добавляет псевдоним к результирующему столбцу.
$__unixEpochFilter(dateColumn) Добавляет фильтр диапазона времени с использованием меток времени Unix. Пример: dateColumn > 1494410783 AND dateColumn < 1494497183
$__unixEpochFrom() Возвращает начало текущего диапазона времени в виде метки времени Unix. Пример: 1494410783
$__unixEpochTo() Возвращает конец текущего диапазона времени в виде метки времени Unix. Пример: 1494497183
$__unixEpochNanoFilter(dateColumn) Добавляет фильтр диапазона времени с использованием меток времени Unix с наносекундной точностью. Пример: dateColumn > 1494410783152415214 AND dateColumn < 1494497183142514872
$__unixEpochNanoFrom() Возвращает начало текущего диапазона времени в виде наносекундной метки времени Unix. Пример: 1494410783152415214
$__unixEpochNanoTo() Возвращает конец текущего диапазона времени в виде наносекундной метки времени Unix. Пример: 1494497183142514872
$__unixEpochGroup(dateColumn, '5m', [fillMode]) То же, что $__timeGroup, но для меток времени Unix. Необязательный fillMode управляет обработкой отсутствующих точек.
$__unixEpochGroupAlias(dateColumn, '5m', [fillMode]) То же, что выше, но добавляет псевдоним к сгруппированному столбцу.

Просмотр интерполированного запроса

Редактор запросов включает ссылку Generated SQL, которая появляется после выполнения запроса при редактировании панели. Нажмите эту ссылку, чтобы просмотреть необработанный интерполированный SQL, который выполнила Grafana, включая все макросы, развёрнутые во время обработки запроса.

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

Чтобы создать табличный запрос, задайте для параметра Format в редакторе запросов значение Table. Это позволяет писать любой допустимый SQL-запрос, а панель Table отображает результаты, используя возвращённые столбцы и строки.

Пример:

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')

Пример запроса с выводом:

SQL
SELECT * FROM [mssql_types]

Используйте ключевое слово AS, чтобы определить псевдоним в вашем запросе для переименования столбца или таблицы.

Пример запроса с выводом:

SQL
SELECT
  c_bit AS [column1], c_tinyint AS [column2]
FROM
  [mssql_types]

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

Note

Храните временные метки в UTC, чтобы избежать проблем со сдвигами времени в Grafana при использовании часовых поясов, отличных от UTC.

Чтобы создать запрос временного ряда, задайте для параметра Format в редакторе запросов значение Time series. Запрос должен включать столбец с именем time, который должен содержать либо значение SQL datetime, либо числовое значение, представляющее время Unix epoch в секундах. Результирующий набор должен быть отсортирован по столбцу time, чтобы панели корректно визуализировали данные.

Запрос временного ряда возвращает результаты в формате wide data frame.

  • Любой столбец, кроме time или типа string, преобразуется в поля значений в результате запроса data frame.
  • Любой строковый столбец преобразуется в метки полей в результате запроса data frame.

Вы можете включить поддержку макросов в предложении SELECT, чтобы упростить создание запросов временных рядов. Используйте выпадающий список Data operations, чтобы выбрать макрос, например $\_\_timeGroup или $\_\_timeGroupAlias, затем выберите столбец времени из выпадающего списка Column и временной интервал из выпадающего списка Interval. Это создаёт запрос временного ряда на основе выбранной вами группировки по времени.

Macros

You can enable macros support in the select clause to create time-series queries.

Use the Data operations drop-down to select a macro like $__timeGroup or $__timeGroupAlias. Select a time column from the Column drop-down and a time interval from the Interval drop-down to create a time-series query.

SQL query builder time-series query
SQL query builder time-series query

You can also add custom value to the Data operations. For example, a function that’s not in the drop-down list. This allows you to add any number of parameters.

Создание запроса метрики

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

Чтобы при необходимости настроить форматирование имени серии по умолчанию, см. Standard options definitions.

Пример со столбцом metric:

SQL
SELECT
  $__timeGroupAlias(time_date_time, '5m'),
  min("value_double"),
  'min' as metric
FROM test_data
WHERE $__timeFilter(time_date_time)
GROUP BY time
ORDER BY 1

Результат data frame:

text
+---------------------+-----------------+
| Name: time          | Name: min       |
| Labels:             | Labels:         |
| Type: []time.Time   | Type: []float64 |
+---------------------+-----------------+
| 2020-01-02 03:05:00 | 3               |
| 2020-01-02 03:10:00 | 6               |
+---------------------+-----------------+

Примеры запросов временных рядов

Используйте параметр fill в макросе $__timeGroupAlias, чтобы вместо этого преобразовать значения null в ноль:

SQL
SELECT
  $__timeGroupAlias(createdAt, '5m', 0),
  sum(value) as value,
  hostname
FROM test_data
WHERE
  $__timeFilter(createdAt)
GROUP BY
  time,
  hostname
ORDER BY 1

Учитывая результат data frame в следующем примере и используя панель graph, вы получите две серии с именами value 10.0.1.1 и value 10.0.1.2. Чтобы отобразить серии с именами 10.0.1.1 и 10.0.1.2, используйте значение отображаемого имени Standard options definitions ${__field.labels.hostname}.

Результат data frame:

text
+---------------------+---------------------------+---------------------------+
| Name: time          | Name: value               | Name: value               |
| Labels:             | Labels: hostname=10.0.1.1 | Labels: hostname=10.0.1.2 |
| Type: []time.Time   | Type: []float64           | Type: []float64           |
+---------------------+---------------------------+---------------------------+
| 2020-01-02 03:05:00 | 3                         | 4                         |
| 2020-01-02 03:10:00 | 6                         | 7                         |
+---------------------+---------------------------+---------------------------+

Использование нескольких столбцов:

SQL
SELECT
  $__timeGroupAlias(time_date_time, '5m'),
  min(value_double) as min_value,
  max(value_double) as max_value
FROM test_data
WHERE $__timeFilter(time_date_time)
GROUP BY time
ORDER BY 1

Результат data frame:

text
+---------------------+-----------------+-----------------+
| Name: time          | Name: min_value | Name: max_value |
| Labels:             | Labels:         | Labels:         |
| Type: []time.Time   | Type: []float64 | Type: []float64 |
+---------------------+-----------------+-----------------+
| 2020-01-02 03:04:00 | 3               | 4               |
| 2020-01-02 03:05:00 | 6               | 7               |
+---------------------+-----------------+-----------------+

Аннотации

Вы можете использовать запросы Microsoft SQL Server в качестве источников аннотаций, чтобы накладывать события на графики вашего дашборда. Подробные инструкции, примеры запросов и рекомендации см. в разделе Аннотации Microsoft SQL Server.

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

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

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

Note

Функции макросов Grafana не работают внутри хранимых процедур.

В следующих примерах таблица базы данных определена в разделе Запросы временных рядов. Допустим, мы хотим визуализировать четыре серии на панели graph, например все комбинации столбцов valueOne, valueTwo и measurement. Панель graph справа визуализирует то, чего мы хотим достичь. Чтобы решить эту задачу, вам нужно использовать два запроса:

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

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

Хранимая процедура с форматом epoch time

Вы можете определить хранимую процедуру, возвращающую все данные, необходимые для отображения нескольких серий (например, 4) на панели graph.

В следующем примере хранимая процедура принимает два параметра, @from и @to, оба типа int. Эти параметры представляют диапазон времени (от/до) в формате epoch time и используются для фильтрации результатов, возвращаемых процедурой.

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

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

Затем на панели graph вы можете использовать следующий запрос, чтобы вызвать хранимую процедуру с диапазоном времени, динамически заполняемым Grafana:

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

EXEC dbo.sp_test_epoch @from, @to

Здесь используются встроенные макросы Grafana для преобразования выбранного диапазона времени в epoch time ($__unixEpochFrom() и $__unixEpochTo()), которые передаются в хранимую процедуру в качестве входных параметров.

Хранимая процедура с форматом datetime

Вы можете определить хранимую процедуру, возвращающую все данные, необходимые для отображения четырёх серий на панели graph.

В следующем примере хранимая процедура принимает два параметра, @from и @to, типа datetime. Эти параметры представляют выбранный диапазон времени и используются для фильтрации возвращаемых данных.

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

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

Чтобы вызвать эту хранимую процедуру из панели graph, используйте следующий запрос со встроенными макросами Grafana для динамического заполнения диапазона времени:

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

EXEC dbo.sp_test_datetime @from, @to

Дальнейшие шаги

После построения запросов вы можете: