

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Microsoft SQL Server 데이터 소스에 연결
<a name="using-microsoft-sql-server-in-AMG"></a>

 Microsoft SQL Server(MSSQL) 데이터 소스를 사용하여 Microsoft Azure SQL Database를 포함하는 모든 Microsoft SQL Server 2005 이상에서 데이터를 쿼리하고 시각화합니다.

**중요**  
Grafana 버전 8.0에서는 Microsoft SQL Server, Postgres 및 MySQL 의 데이터 프레임에 대한 기본 데이터 구조를 변경합니다. 따라서 시계열 쿼리 결과가 와이드 형식으로 반환됩니다. 자세한 내용은 Grafana 데이터 프레임 설명서의 [Wide format](https://grafana.com/developers/plugin-tools/introduction/data-frames#wide-format)을 참조하세요.  
시각화가 이전과 같이 작동하려면 몇 가지 수동 마이그레이션을 수행해야 할 수 있습니다. Github([Postgres/MySQL/MSSQL: Breaking change in v8.0 related to time series queries and ordering of data column](https://github.com/grafana/grafana/issues/35534))에서 한 가지 솔루션이 문서화되어 있습니다.

## 데이터 소스 추가
<a name="mssql-adding-the-data-source"></a>

1.  상단 헤더에서 Grafana 아이콘을 선택하여 사이드 메뉴를 여세요.

1.  사이드 메뉴에서 **구성** 링크 아래에 **데이터 소스** 링크가 있습니다.

1.  상단 헤더에서 **\+ 데이터 소스 추가** 버튼을 선택하세요.

1.  **유형** 드롭다운 목록에서 **Microsoft SQL Server**를 선택하세요.

### 데이터 소스 옵션
<a name="mssql-data-source-options"></a>


|  이름  |  설명  | 
| --- | --- | 
|  Name  |  데이터 소스 이름. 패널 및 쿼리에서 데이터 소스를 보는 방법입니다. | 
|  Default  |  기본 데이터 소스는 새 패널에 대해 미리 선택됨을 의미합니다. | 
|  Host  |  MSSQL 인스턴스의 IP 주소/호스트 이름 및 선택적 포트. 포트가 생략되면 기본값 1433이 사용됩니다. | 
|  Database  |  MSSQL 데이터베이스의 이름. | 
|  User  |  데이터베이스 사용자의 로그인/사용자 이름. | 
|  Password  |  데이터베이스 사용자 암호. | 
|  Encrypt  |  이 옵션은 보안 SSL TCP/IP 연결을 서버와 협상할지 여부 또는 범위(기본값: false)를 결정합니다(Grafana v5.4 이상). | 
|  Max open  |  데이터베이스에 대한 최대 열린 연결 수, 기본값 unlimited(Grafana v5.4 이상). | 
|  Max idle  |  유휴 연결 풀의 최대 연결 수, 기본값: 2(Grafana v5.4 이상). | 
|  Max lifetime  |  연결을 재사용할 수 있는 최대 시간(초 단위, 기본값 14400/4시간). | 

### 최소 시간 간격
<a name="mssql-min-time-interval"></a>

 `$_interval` `$_interval_ms` 변수의 하한. 데이터가 1분마다 기록되는 경우 `1m`과 같이 쓰기 빈도로 설정하는 것이 좋습니다. 이 옵션은 대시보드 패널의 데이터 소스 옵션에서 재정의/구성할 수도 있습니다. 이 값은 숫자 및 유효한 시간 식별자의 순서로 형식이 지정되어야 **합니다**(예: `1m`(1분) 또는 `30s`(30초)). 다음 시간 식별자가 지원됩니다.


|  식별자  |  설명  | 
| --- | --- | 
|  y  |  연도  | 
|  M  |  월  | 
|  w  |  주  | 
|  d  |  일  | 
|  h  |  시간  | 
|  m  |  분  | 
|  s  |  초  | 
|  ms  |  밀리초  | 

### 데이터베이스 사용자 권한
<a name="mssql-database-user-permissions-important"></a>

**중요**  
 데이터 소스를 추가할 때 지정하는 데이터베이스 사용자에게는 쿼리하려는 지정된 데이터베이스 및 테이블에 대한 SELECT 권한만 부여해야 합니다. Grafana에서는 쿼리가 안전한지 검증하지 않습니다. 쿼리에는 모든 SQL 문이 포함될 수 있습니다. 예를 들어 `DELETE FROM user;` 및 `DROP TABLE user;`와 같은 명령문이 실행됩니다. 이를 방지하려면 제한된 권한의 특정 MSSQL 사용자를 생성하는 것이 좋습니다.

 다음 코드 예제에서는 제한된 권한의 특정 MSSQL 사용자를 생성하는 방법을 보여줍니다.

```
 CREATE USER grafanareader WITH PASSWORD 'password'
 GRANT SELECT ON dbo.YourTable3 TO grafanareader
```

 사용자가 퍼블릭 역할에서 원치 않는 권한을 얻지 않도록 해야 합니다.

### 알려진 문제
<a name="mssql-known-issues"></a>

 2008 및 2008R2와 같은 이전 버전의 Microsoft SQL Server를 사용하는 경우 연결을 위해 암호화를 비활성화해야 할 수 있습니다. 가능하면 최적의 호환성을 위해 사용 가능한 최신 서비스 팩을 사용하는 것이 좋습니다.

## 쿼리 편집기
<a name="mssql-query-editor"></a>

 MSSQL 쿼리 편집기는 그래프, 단일 통계 또는 테이블 패널의 편집 모드일 때 지표 탭에서 찾을 수 있습니다. 패널 제목을 선택하고 편집을 선택하여 편집 모드로 전환합니다. 편집기를 사용하면 시각화할 데이터를 선택하도록 SQL 쿼리를 정의할 수 있습니다.

1.  *형식*으로 `Time series`(특히 그래프 또는 단일 통계 패널에서 사용) 또는 `Table`(특히 테이블 패널에서 사용)을 선택하세요.

1.  SQL 쿼리를 작성하는 실제 편집기입니다.

1.  쿼리 편집기 아래에 MSSQL에 대한 도움말 섹션을 표시하세요.

1.  실행된 SQL 쿼리를 표시하세요. 성공적인 쿼리가 실행된 후 먼저 사용 가능합니다.

1.  추가 쿼리 편집기가 표시될 추가 쿼리를 추가하세요.

## 매크로
<a name="mssql-macros"></a>

 구문을 단순화하고 날짜 범위 필터와 같은 동적 부분을 허용하기 위해 쿼리에 매크로가 포함될 수 있습니다.


|  매크로 예제  |  설명  | 
| --- | --- | 
|  $\_\_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])  |  GROUP BY 절에서 사용할 수 있는 표현식으로 대체됩니다. NULL 또는 부동 값의 fillValue를 제공하면 해당 값으로 시간 범위의 빈 시리즈를 자동으로 채웁니다. 예: CAST(ROUND(DATEDIFF(second, "1970-01-01", time\_column)/300.0, 0) as bigint)\*300. | 
|  $\_\_timeGroup(dateColumn,'5m', 0)  |  이전과 동일하지만 채우기 파라미터가 있는 경우 해당 시리즈의 누락된 포인트가 Grafana에 의해 추가되고 0이 값으로 사용됩니다. | 
|  $\_\_timeGroup(dateColumn,'5m', NULL)  |  위와 동일하지만 NULL이 누락 포인트의 값으로 사용됩니다. | 
|  $\_\_timeGroup(dateColumn,'5m', previous)  |  위와 동일하지만 해당 시리즈의 이전 값이 채우기 값으로 사용됩니다. 아직 값이 보이지 않으면 NULL이 사용됩니다(Grafana 5.3 이상에서만 사용 가능). | 

 쿼리 편집기에는 패널 편집 모드에서 쿼리가 실행된 후 표시되는 **생성된 SQL** 링크가 있습니다. 이를 선택하면 실행된 원시 보간 SQL 문자열이 확장되고 표시됩니다.

## 테이블 쿼리
<a name="mssql-table-queries"></a>

 쿼리 옵션에서 **형식**이 **테이블**로 설정된 경우 기본적으로 모든 유형의 SQL 쿼리를 수행할 수 있습니다. 테이블 패널에는 쿼리에서 반환하는 열 및 행의 결과가 자동으로 표시됩니다.

 다음 코드 예제에서는 데이터베이스 테이블을 보여줍니다.

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

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

 다음 코드 예제에서는 쿼리를 보여줍니다.

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

 다음 코드 예제와 같이 일반 `AS` SQL 열 선택 구문을 사용하여 테이블 패널 열의 이름을 제어할 수 있습니다.

```
SELECT
  c_bit as [column1], c_tinyint as [column2]
FROM
  [mssql_types]
```

 결과 테이블 패널: 

## 시계열 쿼리
<a name="mssql-time-series-queries"></a>

 예를 들어 그래프 패널에서 사용하기 위해 **형식**을 **시계열**로 설정한 경우 쿼리는 SQL datetime 또는 Unix 에포크(초 단위)를 반환하는 숫자 데이터 유형을 반환하는 `time`이라는 열을 보유해야 합니다. 값 열의 지표 이름으로 사용되는 `metric` 열을 반환할 수 있습니다. `time` 및 `metric`을 제외한 모든 열은 값 열로 처리됩니다. `metric` 열을 생략하면 값 열의 이름이 지표 이름이 됩니다. 다중 값 열을 선택할 수 있으며, 각 열의 이름은 지표로 표시됩니다. 다중 값 열과 `metric` 열을 반환하면 이 열이 시리즈 이름의 접두사로 사용됩니다.

 시계열 쿼리의 결과 세트는 시간별로 정렬해야 합니다.

 다음 코드 예제에서는 데이터베이스 테이블을 보여줍니다.

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

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

 다음 코드 예제에서는 하나의 `value` 및 하나의 `metric` 열을 보여줍니다.

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

 그래프 패널에서 이전 쿼리를 사용하면 `time` 동안 작성된 두 개의 시리즈(이름이 `Metric A` 및 `Metric B`이고, 값이 `valueOne` 및 `valueTwo`임)가 생성됩니다.

 다음 코드 예제에서는 여러 `value` 열을 보여줍니다.

```
SELECT
  time,
  valueOne,
  valueTwo
FROM
  metric_values
WHERE
  $__timeFilter(time)
ORDER BY 1
```

 그래프 패널에서 이전 쿼리를 사용하면 `time` 동안 작성된 두 개의 시리즈(이름이 `Metric A` 및 `Metric B`이고, 값이 `valueOne` 및 `valueTwo`임)가 생성됩니다.

 다음 코드 예제에서는 $\_\_timeGroup 매크로 사용을 보여줍니다.

```
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
```

 그래프 패널에서 이전 쿼리를 사용하면 `time` 동안 작성된 두 개의 시리즈(이름이 `Metric A` 및 `Metric B`이고, 값이 `valueOne` 및 `valueTwo`임)가 생성됩니다. 3분의 기간에 값이 없는 두 시리즈는 이 두 선 사이에 하나의 선을 렌더링합니다. 오른쪽의 그래프는 절대 0으로 내려가지 않습니다.

 다음 코드 예제에서는 채우기 파라미터가 0으로 설정된 $\_\_timeGroup 매크로 사용을 보여줍니다.

```
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
```

 그래프 패널에서 이 쿼리를 사용하는 경우 결과는 `time` 동안 작성된 두 개의 시리즈(이름이 `Metric A` 및 `Metric B`이고, 합계가 `valueTwo`임)입니다. 3분 기간에 값이 없는 모든 시리즈는 값이 0이며, 그래프에서 오른쪽에 렌더링됩니다.

## 템플릿 지정
<a name="mssql-templating"></a>

 지표 쿼리에서 서버, 애플리케이션 및 센서 이름과 같은 사물을 하드코딩하는 대신 해당 위치에서 변수를 사용할 수 있습니다. 변수는 대시보드 상단에서 드롭다운 선택 상자로 표시됩니다. 이러한 드롭다운 상자를 사용하여 대시보드에 표시되는 데이터를 변경할 수 있습니다.

 템플릿 지정 및 템플릿 변수에 대한 자세한 내용은 [템플릿 및 변수](templates-and-variables.md) 섹션을 참조하세요.

### 쿼리 변수
<a name="mssql-query-variable"></a>

 `Query` 유형의 템플릿 변수를 추가하는 경우 드롭다운 선택 상자로 표시되는 측정 이름, 키 이름 또는 키 값과 같은 항목을 반환할 수 있는 MSSQL 쿼리를 작성할 수 있습니다.

 예를 들어 템플릿 지정 변수 **쿼리 설정에서 이와 같은 쿼리를 지정하여 `hostname` 열의 모든 값을 포함하는 변수를 가질 수 있습니다.

```
SELECT hostname FROM host
```

 쿼리는 여러 열을 반환할 수 있으며 Grafana는 이 열에서 목록을 자동으로 생성합니다. 예를 들어 다음 쿼리는 `hostname` 및 `hostname2`의 값이 포함된 목록을 반환합니다.

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

 또 다른 옵션으로 키/값 변수를 생성할 수 있는 쿼리가 있습니다. 쿼리에서 `__text` 및 `__value`라는 두 개의 열을 반환해야 합니다. `__text` 열 값은 고유해야 합니다(고유하지 않은 경우 첫 번째 값이 사용됨). 드롭다운 목록의 옵션은 텍스트 및 값을 포함하며, 여기에서는 친숙한 이름(텍스트) 및 ID(값)를 지정할 수 있습니다. `hostname`을 텍스트로, `id`를 값으로 사용하는 쿼리 예제: 

```
SELECT hostname __text, id __value FROM host
```

 중첩 변수를 생성할 수도 있습니다. 예를 들어 다른 `region` 변수가 있는 경우. 그런 다음, 호스트 변수가 이와 같은 쿼리를 사용하여 현재 선택한 리전의 호스트만 표시하도록 할 수 있습니다(`region`이 다중 값 변수인 경우 여러 값과 일치시키는 `=`보다 `IN` 비교 연산자 사용).

```
SELECT hostname FROM host WHERE region IN ($region)
```

### 쿼리에서 변수 사용
<a name="mssql-using-variables-in-queries"></a>

**참고**  
 템플릿 변수 값은 템플릿 변수가 `multi-value`인 경우에만 따옴표로 묶습니다.

 변수가 다중 값 변수인 경우 여러 값과 일치시키는 `=`보다 `IN` 비교 연산자를 사용합니다.

 두 가지 구문이 있습니다.

 `$<varname>`: 템플릿 변수 이름이 `hostname`인 예제: 

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

 `[[varname]]`: 템플릿 변수 이름이 `hostname`인 예제: 

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

#### 다중 값 변수에 대한 따옴표 기능 끄기
<a name="mssql-disabling-quoting-for-multi-value-variables"></a>

 Grafana에서는 다중 값 변수에 대해 따옴표로 묶고 쉼표로 구분된 문자열을 자동으로 생성합니다. 예를 들어 `server01` 및 `server02`를 선택하면 `'server01', 'server02'` 형식으로 지정됩니다. 이 기능을 끄려면 변수에 csv 형식 지정 옵션을 사용합니다.

 `${servers:csv}` 

 변수 형식 지정 옵션에 대한 자세한 내용은 [템플릿 및 변수](templates-and-variables.md) 섹션을 참조하세요.

## Annotations
<a name="mssql-annotations"></a>

 주석을 사용하여 그래프 위에 풍부한 이벤트 정보를 오버레이할 수 있습니다. 대시보드 메뉴/주석 보기를 통해 주석 쿼리를 추가합니다. 자세한 내용은 [Annotations](dashboard-annotations.md) 단원을 참조하십시오.

 **열:** 


|  이름  |  설명  | 
| --- | --- | 
|  time  |  날짜/시간 필드의 이름. 기본 SQL 날짜/시간 데이터 유형 또는 에포크 값을 포함하는 열일 수 있습니다. | 
|  timeend  |  종료 날짜/시간 필드의 선택적 이름. 기본 SQL 날짜/시간 데이터 유형 또는 에포크 값을 포함하는 열일 수 있습니다. | 
|  text  |  이벤트 설명 필드. | 
|  tags  |  이벤트 태그에 쉼표로 구분된 문자열로 사용할 선택적 필드 이름. | 

 다음 코드 예제에서는 데이터베이스 테이블을 보여줍니다.

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

 또한 [시계열 쿼리](#mssql-time-series-queries)에 정의된 데이터베이스 테이블도 사용합니다.

 다음 코드 예제에서는 에포크 값이 있는 시간 열을 사용하는 쿼리를 보여줍니다.

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

 다음 코드 예제에서는 에포크 값을 포함하는 time 및 timeend 열을 사용하는 리전 쿼리를 보여줍니다.

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

 다음 코드 예제에서는 기본 SQL 날짜/시간 데이터 유형의 시간 열을 사용하는 쿼리를 보여줍니다.

```
SELECT
  time,
  measurement as text,
  convert(varchar, valueOne) + ',' + convert(varchar, valueTwo) as tags
FROM
  metric_values
WHERE
  $__timeFilter(time_column)
ORDER BY 1
```

## 저장 프로시저 지원
<a name="stored-procedure-support"></a>

 저장 프로시저는 제대로 작동되는지 확인되었습니다. 하지만 예상대로 작동하지 않는 엣지 사례가 있을 수 있습니다. 각 섹션에서 앞서 설명한 것과 같이 저장 프로시저는 열의 동일한 이름 지정을 사용하고 동일한 형식으로 데이터를 반환하는 한, 테이블, 시계열 및 주석 쿼리에서 지원되어야 합니다.

 매크로 함수는 저장 프로시저 내에서 작동하지 않습니다.

### 예제
<a name="mssql-examples"></a>

 다음 예제에서는 데이터베이스 테이블이 시계열 쿼리에 정의되어 있습니다. 열 `valueOne`, `valueTwo`, `measurement`의 모든 조합과 같이 그래프 패널에서 네 개의 시리즈를 시각화하려고 한다고 가정합니다. 오른쪽의 그래프 패널에서는 달성하려는 목표를 시각화합니다. 이 문제를 해결하려면 다음과 같이 두 가지 쿼리를 사용해야 합니다.

 다음 코드 예제에서는 첫 번째 쿼리를 보여줍니다.

```
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
```

 다음 코드 예제에서는 두 번째 쿼리를 보여줍니다.

```
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
```

#### 에포크 형식의 시간을 사용하는 저장 프로시저
<a name="mssql-stored-procedure-using-time-in-epoch-format"></a>

 위와 같은 그래프 패널에서 네 개의 시리즈를 렌더링하는 데 필요한 모든 데이터를 반환하는 저장 프로시저를 정의할 수 있습니다. 이 경우 저장 프로시저는 `int` 데이터 유형의 `@from` 및 `@to` 파라미터 두 개를 수락합니다. 이 파라미터는 저장 프로시저에서 반환할 데이터를 필터링하는 데 사용되는 에포크 형식의 시간 범위(시작\~종료)여야 합니다.

 이 경우 선택 및 그룹화 기준 표현식에서 `$__timeGroup(time, '5m')`을 모방하므로 여러 긴 표현식이 필요합니다. 원하는 경우 MSSQL 함수로 추출할 수 있습니다.

```
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
```

 그런 다음, 그래프 패널에 다음 쿼리를 사용할 수 있습니다.

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

EXEC dbo.sp_test_epoch @from, @to
```

#### datetime 형식의 시간을 사용하는 저장 프로시저
<a name="mssql-stored-procedure-using-time-in-datetime-format"></a>

 위와 같은 그래프 패널에서 네 개의 시리즈를 렌더링하는 데 필요한 모든 데이터를 반환하는 저장 프로시저를 정의할 수 있습니다. 이 경우 저장 프로시저는 `datetime` 데이터 유형의 `@from` 및 `@to` 파라미터 두 개를 수락합니다. 이 파라미터는 저장 프로시저에서 반환할 데이터를 필터링하는 데 사용되는 시간 범위(시작\~종료)여야 합니다.

 이 경우 선택 및 그룹화 기준 표현식에서 `$__timeGroup(time, '5m')`을 모방하므로 여러 긴 표현식이 필요합니다. 원하는 경우 MSSQL 함수로 추출할 수 있습니다.

```
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
```

 그런 다음, 그래프 패널에 다음 쿼리를 사용할 수 있습니다.

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

EXEC dbo.sp_test_datetime @from, @to
```

## 알림
<a name="mssql-alerting"></a>

 시계열 쿼리는 알림 조건에서 작동해야 합니다. 테이블 형식의 쿼리는 알림 규칙 조건에서 아직 지원되지 않습니다.