

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Connectez-vous à une source de données Microsoft SQL Server
<a name="using-microsoft-sql-server-in-AMG"></a>

 Utilisez la source de données Microsoft SQL Server (MSSQL) pour interroger et visualiser les données de tout Microsoft SQL Server 2005 ou version ultérieure, y compris Microsoft Azure SQL Database. 

**Important**  
Grafana version 8.0 modifie la structure de données sous-jacente des trames de données pour Microsoft SQL Server, Postgres et MySQL. Par conséquent, le résultat d'une requête de série chronologique est renvoyé dans un format large. Pour plus d'informations, consultez la section [Format large](https://grafana.com/developers/plugin-tools/introduction/data-frames#wide-format) dans la documentation des trames de données Grafana.  
Pour que vos visualisations fonctionnent comme elles le faisaient auparavant, vous devrez peut-être effectuer des migrations manuelles. Une solution est documentée sur Github à l'adresse suivante [Postgres/MySQL/MSSQL: Breaking change in v8.0 relatif aux requêtes de séries chronologiques et à l'ordre des colonnes de données](https://github.com/grafana/grafana/issues/35534).

## Ajouter la source de données
<a name="mssql-adding-the-data-source"></a>

1.  Ouvrez le menu latéral en choisissant l'icône Grafana dans l'en-tête supérieur. 

1.  Dans le menu latéral, sous le lien **Configuration**, vous devriez trouver un lien **Sources de données**. 

1.  Cliquez sur le bouton **\$1 Ajouter une source de données** dans l'en-tête supérieur. 

1.  Sélectionnez **Microsoft SQL Server** dans la liste déroulante **Type**. 

### Options de source de données
<a name="mssql-data-source-options"></a>


|  Nom  |  Description  | 
| --- | --- | 
|  Name  |  Le nom de la source de données. C'est ainsi que vous voyez la source de données dans les panneaux et les requêtes.  | 
|  Default  |  La source de données par défaut signifie qu'elle sera présélectionnée pour les nouveaux panneaux.  | 
|  Host  |  IP address/hostname et port optionnel de votre instance MSSQL. Si le port est omis, la valeur par défaut 1433 sera utilisée.  | 
|  Database  |  Nom de votre base de données MSSQL.  | 
|  User  |  Login/nom d'utilisateur de l'utilisateur de la base de données.  | 
|  Password  |  Mot de passe de l'utilisateur de la base de données | 
|  Encrypt  |  Cette option détermine si et dans quelle mesure une TCP/IP connexion SSL sécurisée sera négociée avec le serveur, par défaut false (Grafana v5.4\$1).  | 
|  Max open  |  Nombre maximum de connexions ouvertes à la base de données, par défaut unlimited (Grafana v5.4\$1).  | 
|  Max idle  |  Nombre maximal de connexions dans le pool de connexions inactives, par défaut 2 (Grafana v5.4\$1).  | 
|  Max lifetime  |  Durée maximale en secondes pendant laquelle une connexion peut être réutilisée, par défaut 14400 /4 heures.  | 

### Intervalle de temps minimum
<a name="mssql-min-time-interval"></a>

 Une limite inférieure pour les `$_interval` `$_interval_ms` variables. Il est recommandé de régler la fréquence d'écriture, par exemple `1m` si vos données sont écrites toutes les minutes. Cette option peut également se trouver overridden/configured dans un panneau de tableau de bord sous les options de source de données. Cette valeur **doit** être formatée sous la forme d'un nombre suivi d'un identifiant horaire valide, par exemple `1m` (1 minute) ou `30s` (30 secondes). Les identifiants horaires suivants sont pris en charge.


|  Identifiant  |  Description  | 
| --- | --- | 
|  y  |  Année  | 
|  M  |  Mois  | 
|  w  |  semaine  | 
|  d  |  jour  | 
|  h  |  Heure  | 
|  m  |  Minute  | 
|  s  |  Seconde  | 
|  ms  |  Milliseconde  | 

### Autorisations utilisateur de base de données
<a name="mssql-database-user-permissions-important"></a>

**Important**  
 L'utilisateur de base de données que vous spécifiez lorsque vous ajoutez la source de données ne doit disposer des autorisations SELECT que sur la base de données et les tables spécifiées que vous souhaitez interroger. Grafana ne confirme pas que la requête est sûre. La requête peut inclure n'importe quelle instruction SQL. Par exemple, des instructions telles que `DELETE FROM user;` et `DROP TABLE user;` seraient exécutées. Pour vous protéger contre cela, nous vous recommandons vivement de créer un utilisateur MSSQL spécifique avec des autorisations restreintes. 

 L'exemple de code suivant montre la création d'un utilisateur MSSQL spécifique avec des autorisations restreintes. 

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

 Assurez-vous que l'utilisateur n'obtient aucune autorisation indésirable de la part du rôle public. 

### Problèmes connus
<a name="mssql-known-issues"></a>

 Si vous utilisez une ancienne version de Microsoft SQL Server, telle que 2008 et 2008R2, vous devrez peut-être désactiver le chiffrement pour pouvoir vous connecter. Dans la mesure du possible, nous vous recommandons d'utiliser le dernier service pack disponible pour une compatibilité optimale. 

## Éditeur de requêtes
<a name="mssql-query-editor"></a>

 Vous trouverez l'éditeur de requêtes MSSQL dans l'onglet métriques du mode d'édition du graphique, de Singlestat ou du tableau de bord. Vous passez en mode édition en choisissant le titre du panneau, puis en choisissant Modifier. L'éditeur permet de définir une requête SQL pour sélectionner les données à visualiser. 

1.  Sélectionnez *Format comme* `Time series` (pour une utilisation dans les panneaux Graph ou Singlestat, entre autres) ou `Table` (pour une utilisation dans le panneau Table, entre autres). 

1.  Il s'agit de l'éditeur dans lequel vous écrivez vos requêtes SQL. 

1.  Afficher la section d'aide pour MSSQL sous l'éditeur de requêtes. 

1.  Afficher la requête SQL qui a été exécutée. Sera disponible en premier une fois qu'une requête aura été exécutée avec succès. 

1.  Ajoutez une requête supplémentaire dans laquelle un éditeur de requêtes supplémentaire sera affiché. 

## Macros
<a name="mssql-macros"></a>

 Pour simplifier la syntaxe et autoriser les parties dynamiques, telles que les filtres de plage de dates, la requête peut contenir des macros. 


|  Exemple de macro  |  Description  | 
| --- | --- | 
|  \$1\$1\$1time(dateColumn)  |  Sera remplacée par une expression pour renommer la colonne en fonction de l'heure. Par exemple, DateColumn comme heure. | 
|  \$1\$1\$1timeEpoch(dateColumn)  |  Sera remplacé par une expression pour convertir un type de colonne DATETIME en horodatage Unix et le renommer en heure. Par exemple, DATEDIFF (second, « 1970-01-01 », DateColumn) AS time.  | 
|  \$1\$1\$1timeFilter(dateColumn)  |  Sera remplacé par un filtre de plage de temps utilisant le nom de colonne spécifié. Par exemple, DateColumn BETWEEN « 2017-04-21T 05:01:17 Z » ET « 2017-04-21T 05:06:17 Z ».  | 
|  \$1\$1\$1timeFrom()  |  Sera remplacé par le début de la sélection d'heure actuellement active. Par exemple, « 2017-04-21T 05:01:17 Z ».  | 
|  \$1\$1\$1timeTo()  |  Sera remplacé à la fin de la sélection d'heure actuellement active. Par exemple, « 2017-04-21T 05:06:17 Z ».  | 
|  \$1\$1\$1timeGroup(dateColumn,'5m'[, fillvalue])  |  Sera remplacée par une expression utilisable dans la clause GROUP BY. Fournir une valeur FillValue NULL ou une valeur flottante remplira automatiquement les séries vides dans la plage de temps avec cette valeur. Par exemple, CAST (ROUND (DATEDIFF (second, « 1970-01-01", time\$1column) /300.0, 0) en tant que bigint) \$1300.  | 
|  \$1\$1\$1timeGroup(dateColumn,'5m', 0)  |  Identique au précédent mais avec un paramètre de remplissage, les points manquants dans cette série seront ajoutés par grafana et 0 sera utilisé comme valeur.  | 
|  \$1\$1\$1timeGroup(dateColumn,'5m', NULL)  |  Comme ci-dessus, mais NULL sera utilisé comme valeur pour les points manquants.  | 
|  \$1\$1\$1timeGroup(dateColumn,'5m', previous)  |  Comme ci-dessus, mais la valeur précédente de cette série sera utilisée comme valeur de remplissage si aucune valeur n'a été vue, mais la valeur NULL sera utilisée (uniquement disponible dans Grafana 5.3\$1).  | 

 L'éditeur de requêtes possède un lien **SQL généré** qui s'affiche après l'exécution d'une requête, en mode édition du panneau. Choisissez-le et il se développera et affichera la chaîne SQL interpolée brute qui a été exécutée. 

## Requêtes de table
<a name="mssql-table-queries"></a>

 Si l'option de requête est définie sur **Formater en tant que** **table**, vous pouvez essentiellement effectuer n'importe quel type de requête SQL. Le panneau du tableau affiche automatiquement les résultats des colonnes et des lignes renvoyées par votre requête. 

 L'exemple de code suivant montre une table de base de données. 

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

 L'exemple de code suivant montre une requête. 

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

 Vous pouvez contrôler le nom des colonnes du panneau Table à l'aide de la syntaxe `AS` SQL classique de sélection des colonnes, comme illustré dans l'exemple de code suivant. 

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

 Le panneau de table qui en résulte : 

## Requêtes de séries chronologiques
<a name="mssql-time-series-queries"></a>

 Si vous définissez le **format comme** **série chronologique**, pour une utilisation dans le panneau graphique par exemple, la requête doit avoir une colonne nommée `time` qui renvoie soit une date SQL, soit un type de données numérique représentant l'époque Unix en secondes. Vous pouvez renvoyer une colonne nommée `metric` qui est utilisée comme nom de métrique pour la colonne de valeurs. Toute colonne sauf `time` et `metric` est traitée comme une colonne de valeur. Si vous omettez la `metric` colonne, le nom de la colonne de valeur sera le nom de la métrique. Vous pouvez sélectionner plusieurs colonnes de valeurs, chacune portant son nom de métrique. Si vous renvoyez plusieurs colonnes de valeurs et une colonne nommée`metric`, cette colonne est utilisée comme préfixe pour le nom de série. 

 Les ensembles de résultats des requêtes de séries chronologiques doivent être triés par ordre chronologique. 

 L'exemple de code suivant montre une table de base de données. 

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

 L'exemple de code suivant montre une `value` et une `metric` colonne. 

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

 Lorsque la requête précédente est utilisée dans un panneau graphique, elle produit deux séries nommées `Metric A` et `Metric B` avec les valeurs `valueOne` et `valueTwo` tracées dessus`time`. 

 L'exemple de code suivant montre plusieurs `value` colonnes. 

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

 Lorsque la requête précédente est utilisée dans un panneau graphique, elle produit deux séries nommées `Metric A` et `Metric B` avec les valeurs `valueOne` et `valueTwo` tracées dessus`time`. 

 L'exemple de code suivant montre l'utilisation de la macro \$1\$1\$1timeGroup. 

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

 Lorsque la requête précédente est utilisée dans un panneau graphique, elle produit deux séries nommées `Metric A` et `Metric B` avec les valeurs `valueOne` et `valueTwo` tracées dessus`time`. Toute série dépourvue de valeur dans une fenêtre de trois minutes affichera une ligne entre ces deux lignes. Vous remarquerez que le graphique de droite ne descend jamais à zéro. 

 L'exemple de code suivant montre l'utilisation de la macro \$1\$1\$1timeGroup avec un paramètre de remplissage défini sur zéro. 

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

 Lorsque cette requête est utilisée dans un panneau graphique, le résultat est deux séries nommées `Metric A` et `Metric B` dont la somme est `valueTwo` tracée au-dessus`time`. Toute série dépourvue de valeur dans une fenêtre de 3 minutes aura une valeur de zéro, que vous verrez apparaître dans le graphique de droite. 

## Création de modèles
<a name="mssql-templating"></a>

 Au lieu de coder en dur des éléments tels que le nom du serveur, de l'application et du capteur dans vos requêtes métriques, vous pouvez utiliser des variables à leur place. Les variables sont affichées sous forme de boîtes de sélection déroulantes en haut du tableau de bord. Vous pouvez utiliser ces listes déroulantes pour modifier les données affichées dans votre tableau de bord. 

 Pour plus d'informations sur la création de modèles et les variables de modèle, consultez[Modèles et variables](templates-and-variables.md). 

### Variable de requête
<a name="mssql-query-variable"></a>

 Si vous ajoutez une variable de modèle de ce type`Query`, vous pouvez écrire une requête MSSQL qui peut renvoyer des éléments tels que des noms de mesures, des noms de clés ou des valeurs de clé affichés sous forme de boîte de sélection déroulante. 

 Par exemple, vous pouvez avoir une variable contenant toutes les valeurs de la `hostname` colonne d'une table si vous spécifiez une requête comme celle-ci dans le paramètre *Query* de la variable de modèle. 

```
SELECT hostname FROM host
```

 Une requête peut renvoyer plusieurs colonnes et Grafana créera automatiquement une liste à partir de celles-ci. Par exemple, la requête suivante renverra une liste contenant les valeurs de `hostname` et`hostname2`. 

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

 Une autre option est une requête qui permet de créer une key/value variable. La requête doit renvoyer deux colonnes nommées `__text` et`__value`. La valeur de la `__text` colonne doit être unique (si elle ne l'est pas, c'est la première valeur qui est utilisée). Les options de la liste déroulante comporteront un texte et une valeur qui vous permettront d'avoir un nom convivial sous forme de texte et un identifiant comme valeur. Exemple de requête avec `hostname` comme texte et `id` comme valeur : 

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

 Vous pouvez également créer des variables imbriquées. Par exemple, si vous aviez une autre variable nommée`region`. Vous pouvez alors faire en sorte que la variable hosts n'affiche que les hôtes de la région actuellement sélectionnée avec une requête comme celle-ci (s'il s'`region`agit d'une variable à valeurs multiples, utilisez l'opérateur de `IN` comparaison plutôt que de la comparer `=` à plusieurs valeurs). 

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

### Utilisation de variables dans les requêtes
<a name="mssql-using-variables-in-queries"></a>

**Note**  
 Les valeurs des variables de modèle ne sont citées que lorsque la variable de modèle est un`multi-value`. 

 Si la variable est une variable à valeurs multiples, utilisez l'opérateur de `IN` comparaison plutôt que de `=` la comparer à plusieurs valeurs. 

 Il existe deux syntaxes : 

 `$<varname>`Exemple avec une variable de modèle nommée `hostname` : 

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

 `[[varname]]`Exemple avec une variable de modèle nommée `hostname` : 

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

#### Désactiver les guillemets pour les variables à valeurs multiples
<a name="mssql-disabling-quoting-for-multi-value-variables"></a>

 Grafana crée automatiquement une chaîne entre guillemets séparée par des virgules pour les variables à valeurs multiples. Par exemple, si `server01` et `server02` sont sélectionnés, il sera formaté comme suit :`'server01', 'server02'`. Pour désactiver les guillemets, utilisez l'option de formatage csv pour les variables. 

 `${servers:csv}` 

 Pour plus d'informations sur les options de mise en forme des variables, consultez[Modèles et variables](templates-and-variables.md). 

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

 Vous pouvez utiliser des annotations pour superposer des informations détaillées sur les événements au-dessus des graphiques. Vous pouvez ajouter des requêtes d'annotation via le menu Tableau de bord/Vue des annotations. Pour de plus amples informations, veuillez consulter [Annotations](dashboard-annotations.md). 

 **Colonnes :** 


|  Nom  |  Description  | 
| --- | --- | 
|  time  |  Le nom du date/time champ. Il peut s'agir d'une colonne avec un type de date/time données SQL natif ou une valeur d'époque.  | 
|  timeend  |  Nom facultatif du date/time champ de fin. Il peut s'agir d'une colonne avec un type de date/time données SQL natif ou une valeur d'époque.  | 
|  text  |  Champ de description de l'événement.  | 
|  tags  |  Nom de champ facultatif à utiliser pour les balises d'événements sous forme de chaîne séparée par des virgules.  | 

 L'exemple de code suivant montre les tables de base de données. 

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

 Nous utilisons également la table de base de données définie dans[Requêtes de séries chronologiques](#mssql-time-series-queries). 

 L'exemple de code suivant montre une requête utilisant une colonne de temps avec des valeurs d'époque. 

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

 L'exemple de code suivant montre une requête de région utilisant des colonnes d'heure et de fin de période avec des valeurs d'époque. 

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

 L'exemple de code suivant montre une requête utilisant une colonne de temps de type date/time SQL natif. 

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

## Support des procédures stockées
<a name="stored-procedure-support"></a>

 Le fonctionnement des procédures enregistrées a été vérifié. Cependant, il peut y avoir des cas extrêmes où cela ne fonctionnera pas comme prévu. Les procédures stockées doivent être prises en charge dans les requêtes de table, de séries chronologiques et d'annotation, à condition que vous utilisiez le même nom de colonnes et que vous rencontriez les données dans le même format que celui décrit précédemment dans les sections respectives. 

 Les fonctions macro ne fonctionneront pas dans une procédure stockée. 

### Exemples
<a name="mssql-examples"></a>

 Dans les exemples suivants, la table de base de données est définie dans les requêtes de séries chronologiques. Supposons que vous souhaitiez visualiser quatre séries dans un panneau graphique, telles que toutes les combinaisons de colonnes`valueOne`, `valueTwo` et`measurement`. Le panneau graphique à droite permet de visualiser ce que nous voulons réaliser. Pour résoudre ce problème, vous devez utiliser deux requêtes : 

 L'exemple de code suivant montre la première requête. 

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

 L'exemple de code suivant montre la deuxième requête. 

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

#### Procédure stockée utilisant le temps au format Epoch
<a name="mssql-stored-procedure-using-time-in-epoch-format"></a>

 Vous pouvez définir une procédure stockée qui renverra toutes les données dont vous avez besoin pour afficher quatre séries dans un panneau graphique comme ci-dessus. Dans ce cas, la procédure stockée accepte deux paramètres, l'un `@from` des `@to` types de `int` données, qui doit être une plage de temps (de à) au format epoch qui sera utilisée pour filtrer les données à renvoyer par la procédure stockée. 

 Cela imite les expressions `$__timeGroup(time, '5m')` in select et group by, et c'est pourquoi de nombreuses expressions longues sont nécessaires. Elles peuvent être extraites vers des fonctions MSSQL, si vous le souhaitez.

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

 Vous pouvez ensuite utiliser la requête suivante pour votre panneau graphique. 

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

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

#### Procédure stockée utilisant l'heure au format date/heure
<a name="mssql-stored-procedure-using-time-in-datetime-format"></a>

 Vous pouvez définir une procédure stockée qui renverra toutes les données dont vous avez besoin pour afficher quatre séries dans un panneau graphique comme ci-dessus. Dans ce cas, la procédure stockée accepte deux paramètres, `@from` l'un des types de `datetime` données, qui doit être une plage de temps (de à) qui sera utilisée pour filtrer les données à renvoyer par la procédure stockée. `@to` 

 Cela imite les expressions `$__timeGroup(time, '5m')` in select et group by, et c'est pourquoi de nombreuses expressions longues sont nécessaires. Elles peuvent être extraites vers des fonctions MSSQL, si vous le souhaitez. 

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

 Vous pouvez ensuite utiliser la requête suivante pour votre panneau graphique. 

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

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

## Alerte
<a name="mssql-alerting"></a>

 Les requêtes de séries chronologiques devraient fonctionner dans des conditions d'alerte. Les requêtes mises en forme de tableau ne sont pas encore prises en charge dans les conditions des règles d'alerte. 