

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Stellen Sie eine Connect zu einer Microsoft SQL Server-Datenquelle her
<a name="using-microsoft-sql-server-in-AMG"></a>

 Verwenden Sie die Microsoft SQL Server (MSSQL) -Datenquelle, um Daten aus einem beliebigen Microsoft SQL Server 2005 oder neuer, einschließlich Microsoft Azure SQL-Datenbank, abzufragen und zu visualisieren. 

**Wichtig**  
Grafana Version 8.0 ändert die zugrunde liegende Datenstruktur für Datenrahmen für Microsoft SQL Server, Postgres und MySQL. Infolgedessen wird ein Zeitreihenabfrageergebnis in einem breiten Format zurückgegeben. Weitere Informationen finden Sie unter [Wide Format](https://grafana.com/developers/plugin-tools/introduction/data-frames#wide-format) in der Grafana-Datenrahmen-Dokumentation.  
Damit Ihre Visualisierungen wie zuvor funktionieren, müssen Sie möglicherweise einige manuelle Migrationen durchführen. Eine Lösung ist auf Github unter dokumentiert [Postgres/MySQL/MSSQL: Wichtige Änderungen in Version 8.0 in Bezug auf Zeitreihenabfragen und die Reihenfolge](https://github.com/grafana/grafana/issues/35534) von Datenspalten.

## Hinzufügen der Datenquelle
<a name="mssql-adding-the-data-source"></a>

1.  Öffnen Sie das Seitenmenü, indem Sie das Grafana-Symbol in der oberen Kopfzeile auswählen. 

1.  Im Seitenmenü unter dem Link **Konfiguration** sollten Sie einen Link **Datenquellen** finden. 

1.  Wählen Sie in der oberen Kopfzeile die Schaltfläche **\$1 Datenquelle hinzufügen**. 

1.  Wählen Sie **Microsoft SQL Server** aus der Dropdownliste **Typ** aus. 

### Datenquellenoptionen
<a name="mssql-data-source-options"></a>


|  Name  |  Description  | 
| --- | --- | 
|  Name  |  Der Name der Datenquelle. So sehen Sie die Datenquelle in Bedienfeldern und Abfragen.  | 
|  Default  |  Die Standarddatenquelle bedeutet, dass sie für neue Panels vorab ausgewählt wird.  | 
|  Host  |  Die IP address/hostname und der optionale Port Ihrer MSSQL-Instanz. Wenn der Port weggelassen wird, wird der Standardwert 1433 verwendet.  | 
|  Database  |  Name Ihrer MSSQL-Datenbank.  | 
|  User  |  Login/Benutzername des Datenbankbenutzers.  | 
|  Password  |  Passwort des Datenbankbenutzers. | 
|  Encrypt  |  Diese Option bestimmt, ob oder in welchem Umfang eine sichere TCP/IP SSL-Verbindung mit dem Server ausgehandelt wird, Standard false (Grafana v5.4\$1).  | 
|  Max open  |  Die maximale Anzahl offener Verbindungen zur Datenbank, Standard unlimited (Grafana v5.4\$1).  | 
|  Max idle  |  Die maximale Anzahl von Verbindungen im inaktiven Verbindungspool, Standard 2 (Grafana v5.4\$1).  | 
|  Max lifetime  |  Die maximale Zeit in Sekunden, für die eine Verbindung wiederverwendet werden kann, Standardeinstellung /4 Stunden. 14400  | 

### Minimales Zeitintervall
<a name="mssql-min-time-interval"></a>

 Eine Untergrenze für die `$_interval` `$_interval_ms` Variablen. Es wird empfohlen, die Schreibfrequenz einzustellen, z. B. `1m` wenn Ihre Daten jede Minute geschrieben werden. Diese Option kann auch overridden/configured in einem Dashboard-Bereich unter Datenquellenoptionen angezeigt werden. Dieser Wert **muss** als Zahl gefolgt von einer gültigen Zeitkennung formatiert werden, z. B. `1m` (1 Minute) oder `30s` (30 Sekunden). Die folgenden Zeitkennungen werden unterstützt.


|  Kennung  |  Description  | 
| --- | --- | 
|  y  |  Jahr  | 
|  M  |  Monat  | 
|  w  |  Woche  | 
|  d  |  Tag  | 
|  h  |  Stunde  | 
|  m  |  Minute  | 
|  s  |  Sekunde  | 
|  ms  |  Millisekunde  | 

### Berechtigungen für Datenbankbenutzer
<a name="mssql-database-user-permissions-important"></a>

**Wichtig**  
 Dem Datenbankbenutzer, den Sie beim Hinzufügen der Datenquelle angeben, sollten nur SELECT-Berechtigungen für die angegebene Datenbank und die Tabellen erteilt werden, die Sie abfragen möchten. Grafana überprüft nicht, ob die Abfrage sicher ist. Die Abfrage kann jede SQL-Anweisung enthalten. Beispielsweise `DROP TABLE user;` würden Anweisungen wie `DELETE FROM user;` und ausgeführt werden. Um sich davor zu schützen, empfehlen wir dringend, einen bestimmten MSSQL-Benutzer mit eingeschränkten Rechten zu erstellen. 

 Der folgende Beispielcode zeigt die Erstellung eines bestimmten MSSQL-Benutzers mit eingeschränkten Rechten. 

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

 Stellen Sie sicher, dass der Benutzer keine unerwünschten Berechtigungen von der öffentlichen Rolle erhält. 

### Bekannte Probleme
<a name="mssql-known-issues"></a>

 Wenn Sie eine ältere Version von Microsoft SQL Server wie 2008 und 2008R2 verwenden, müssen Sie möglicherweise die Verschlüsselung deaktivieren, um eine Verbindung herstellen zu können. Wenn möglich, empfehlen wir Ihnen, das neueste verfügbare Service Pack zu verwenden, um eine optimale Kompatibilität zu gewährleisten. 

## Abfrage-Editor
<a name="mssql-query-editor"></a>

 Sie finden den MSSQL-Abfrage-Editor auf der Registerkarte „Metriken“ im Bearbeitungsmodus des Diagramm-, Singlestat- oder Tabellenfensters. Sie wechseln in den Bearbeitungsmodus, indem Sie den Titel des Bedienfelds und dann Bearbeiten wählen. Mit dem Editor können Sie eine SQL-Abfrage definieren, um Daten auszuwählen, die visualisiert werden sollen. 

1.  Wählen Sie *Format als* `Time series` (unter anderem zur Verwendung in Graph- oder Singlestat-Bedienfeldern) oder `Table` (unter anderem zur Verwendung im Tabellenfenster). 

1.  Dies ist der eigentliche Editor, in den Sie Ihre SQL-Abfragen schreiben. 

1.  Zeigt den Hilfebereich für MSSQL unter dem Abfrage-Editor an. 

1.  Zeigt die SQL-Abfrage an, die ausgeführt wurde. Wird zuerst verfügbar sein, nachdem eine erfolgreiche Abfrage ausgeführt wurde. 

1.  Fügen Sie eine zusätzliche Abfrage hinzu, bei der ein zusätzlicher Abfrage-Editor angezeigt wird. 

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

 Um die Syntax zu vereinfachen und dynamische Teile wie Datumsbereichsfilter zu berücksichtigen, kann die Abfrage Makros enthalten. 


|  Beispiel für ein Makro  |  Description  | 
| --- | --- | 
|  \$1\$1\$1time(dateColumn)  |  Wird durch einen Ausdruck ersetzt, um die Spalte in Zeit umzubenennen. Zum Beispiel DateColumn als Uhrzeit. | 
|  \$1\$1\$1timeEpoch(dateColumn)  |  Wird durch einen Ausdruck ersetzt, um einen DATETIME-Spaltentyp in einen Unix-Zeitstempel zu konvertieren und ihn in Zeit umzubenennen. Zum Beispiel DATEDIFF (second, „1970-01-01", DateColumn) ALS Uhrzeit.  | 
|  \$1\$1\$1timeFilter(dateColumn)  |  Wird durch einen Zeitbereichsfilter ersetzt, der den angegebenen Spaltennamen verwendet. Zum Beispiel DateColumn BETWEEN „2017-04-21T 05:01:17 Z“ UND „2017-04-21T 05:06:17 Z“.  | 
|  \$1\$1\$1timeFrom()  |  Wird durch den Start der aktuell aktiven Zeitauswahl ersetzt. Zum Beispiel „2017-04-21T 05:01:17 Z“.  | 
|  \$1\$1\$1timeTo()  |  Wird durch das Ende der aktuell aktiven Zeitauswahl ersetzt. Zum Beispiel „2017-04-21T 05:06:17 Z“.  | 
|  \$1\$1\$1timeGroup(dateColumn,'5m'[, fillvalue])  |  Wird durch einen Ausdruck ersetzt, der in der GROUP BY-Klausel verwendet werden kann. Wenn Sie für FillValue den Wert NULL oder einen Gleitkommawert angeben, werden leere Reihen im Zeitbereich automatisch mit diesem Wert gefüllt. Beispiel: CAST (ROUND (DATEDIFF (second, „1970-01-01", time\$1column) /300.0, 0) als bigint) \$1300.  | 
|  \$1\$1\$1timeGroup(dateColumn,'5m', 0)  |  Wie zuvor, aber mit einem Füllparameter, sodass fehlende Punkte in dieser Serie von grafana hinzugefügt und 0 als Wert verwendet wird.  | 
|  \$1\$1\$1timeGroup(dateColumn,'5m', NULL)  |  Wie oben, aber NULL wird als Wert für fehlende Punkte verwendet.  | 
|  \$1\$1\$1timeGroup(dateColumn,'5m', previous)  |  Wie oben, aber der vorherige Wert in dieser Reihe wird als Füllwert verwendet, wenn noch kein Wert gesehen wurde. NULL wird verwendet (nur in Grafana 5.3\$1 verfügbar).  | 

 Der Abfrage-Editor verfügt über einen Link **Generiertes SQL**, der angezeigt wird, nachdem eine Abfrage ausgeführt wurde, während Sie sich im Panel-Bearbeitungsmodus befinden. Wenn Sie ihn auswählen, wird er erweitert und zeigt die unformatierte interpolierte SQL-Zeichenfolge an, die ausgeführt wurde. 

## Tabellenabfragen
<a name="mssql-table-queries"></a>

 Wenn die Abfrageoption auf **Als **Tabelle** formatieren** gesetzt ist, können Sie grundsätzlich jede Art von SQL-Abfrage ausführen. Das Tabellenfenster zeigt automatisch die Ergebnisse der Spalten und Zeilen an, die Ihre Abfrage zurückgibt. 

 Der folgende Beispielcode zeigt eine Datenbanktabelle. 

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

 Der folgende Beispielcode zeigt eine Abfrage. 

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

 Sie können den Namen der Spalten im Tabellenfenster mithilfe der regulären `AS` SQL-Spaltenauswahlsyntax steuern, wie im folgenden Beispielcode gezeigt. 

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

 Das resultierende Tabellenfeld: 

## Zeitreihenabfragen
<a name="mssql-time-series-queries"></a>

 Wenn Sie **Format** auf **Zeitreihe** festlegen, z. B. für die Verwendung im Grafikfenster, muss die Abfrage eine Spalte mit dem Namen `time` haben, die entweder einen SQL-Datetime-Wert oder einen beliebigen numerischen Datentyp zurückgibt, der die Unix-Epoche in Sekunden darstellt. Sie können eine Spalte mit dem Namen zurückgeben`metric`, der als Metrikname für die Wertspalte verwendet wird. Jede Spalte außer `time` und `metric` wird als Wertspalte behandelt. Wenn Sie die `metric` Spalte weglassen, ist der Name der Wertspalte der Metrikname. Sie können mehrere Wertspalten auswählen, von denen jede ihren Namen als Metrik hat. Wenn Sie mehrere Wertspalten und eine Spalte mit dem Namen zurückgeben, `metric` wird diese Spalte als Präfix für den Seriennamen verwendet. 

 Ergebnissätze von Zeitreihenabfragen müssen nach Zeit sortiert werden. 

 Der folgende Beispielcode zeigt eine Datenbanktabelle. 

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

 Der folgende Beispielcode zeigt eine `value` und eine `metric` Spalte. 

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

 Wenn die vorhergehende Abfrage in einem Grafikfenster verwendet wird, werden zwei Reihen mit Namen `Metric A` und `Metric B` mit den Werten erstellt, über `time` denen die Werte `valueOne` `valueTwo` dargestellt werden. 

 Der folgende Beispielcode zeigt mehrere `value` Spalten. 

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

 Wenn die vorhergehende Abfrage in einem Grafikfenster verwendet wird, werden zwei Reihen mit Namen `Metric A` und `Metric B` mit den Werten `valueOne` erzeugt, die `valueTwo` `time` überzeichnet wurden. 

 Der folgende Beispielcode zeigt die Verwendung des Makros \$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
```

 Wenn die vorherige Abfrage in einem Grafikfenster verwendet wird, werden zwei Reihen mit Namen `Metric A` und `Metric B` mit den Werten `valueOne` erstellt, die übereinander gezeichnet wurden. `valueTwo` `time` Bei zwei Reihen, in denen innerhalb eines Drei-Minuten-Fensters ein Wert fehlt, wird eine Linie zwischen diesen beiden Linien dargestellt. Sie werden feststellen, dass das Diagramm auf der rechten Seite niemals auf Null sinkt. 

 Der folgende Beispielcode zeigt die Verwendung des Makros \$1\$1\$1timeGroup mit einem Füllparameter, der auf Null gesetzt ist. 

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

 Wenn diese Abfrage in einem Grafikfeld verwendet wird, sind das Ergebnis zwei Reihen `Metric B` mit Namen `Metric A` und übereinander geplottet. `valueTwo` `time` Jede Reihe, in der innerhalb eines Drei-Minuten-Fensters ein Wert fehlt, hat den Wert Null. Dieser Wert wird im Diagramm auf der rechten Seite wiedergegeben. 

## Erstellen von Vorlagen
<a name="mssql-templating"></a>

 Anstatt Dinge wie Server-, Anwendungs- und Sensornamen in Ihren metrischen Abfragen fest zu codieren, können Sie stattdessen Variablen verwenden. Variablen werden als Drop-down-Auswahlfelder oben im Dashboard angezeigt. Sie können diese Dropdown-Felder verwenden, um die in Ihrem Dashboard angezeigten Daten zu ändern. 

 Weitere Informationen zu Vorlagen und Vorlagenvariablen finden Sie unter. [Vorlagen und Variablen](templates-and-variables.md) 

### Variable abfragen
<a name="mssql-query-variable"></a>

 Wenn Sie eine Vorlagenvariable dieses Typs hinzufügen`Query`, können Sie eine MSSQL-Abfrage schreiben, die beispielsweise Messnamen, Schlüsselnamen oder Schlüsselwerte zurückgeben kann, die als Dropdownauswahlfeld angezeigt werden. 

 *Sie können beispielsweise eine Variable verwenden, die alle Werte für die `hostname` Spalte in einer Tabelle enthält, wenn Sie eine solche Abfrage in der Abfrageeinstellung für die Vorlagenvariable angeben.* 

```
SELECT hostname FROM host
```

 Eine Abfrage kann mehrere Spalten zurückgeben und Grafana erstellt automatisch eine Liste daraus. Die folgende Abfrage gibt beispielsweise eine Liste mit Werten von `hostname` und `hostname2` zurück. 

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

 Eine weitere Option ist eine Abfrage, die eine key/value Variable erstellen kann. Die Abfrage sollte zwei Spalten mit dem Namen `__text` und zurückgeben`__value`. Der `__text` Spaltenwert sollte eindeutig sein (wenn er nicht eindeutig ist, wird der erste Wert verwendet). Die Optionen in der Dropdownliste enthalten einen Text und einen Wert, sodass Sie einen benutzerfreundlichen Namen als Text und eine ID als Wert angeben können. Eine Beispielabfrage mit `hostname` als Text und `id` als Wert: 

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

 Sie können auch verschachtelte Variablen erstellen. Zum Beispiel, wenn Sie eine andere Variable benannt `region` haben. Dann könnten Sie festlegen, dass die hosts-Variable nur Hosts aus der aktuell ausgewählten Region mit einer Abfrage wie dieser anzeigt (wenn `region` es sich `=` um eine Variable mit mehreren Werten handelt, verwenden Sie den `IN` Vergleichsoperator, anstatt einen Vergleich mit mehreren Werten durchzuführen). 

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

### Verwenden von Variablen in Abfragen
<a name="mssql-using-variables-in-queries"></a>

**Anmerkung**  
 Werte von Vorlagenvariablen werden nur in Anführungszeichen gesetzt, wenn die Vorlagenvariable a ist`multi-value`. 

 Wenn es sich bei der Variablen um eine Variable mit mehreren Werten handelt, verwenden Sie den `IN` Vergleichsoperator`=`, anstatt sie mit mehreren Werten abzugleichen. 

 Es gibt zwei Syntaxen: 

 `$<varname>`Beispiel mit einer Vorlagenvariablen namens`hostname`: 

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

 `[[varname]]`Beispiel mit einer Vorlagenvariablen namens`hostname`: 

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

#### Ausschalten der Anführungszeichen für Variablen mit mehreren Werten
<a name="mssql-disabling-quoting-for-multi-value-variables"></a>

 Grafana erstellt automatisch eine durch Kommas getrennte Zeichenfolge in Anführungszeichen für Variablen mit mehreren Werten. Wenn beispielsweise `server01` und ausgewählt `server02` sind, wird es wie folgt formatiert:. `'server01', 'server02'` Um das Zitieren zu deaktivieren, verwenden Sie die CSV-Formatierungsoption für Variablen. 

 `${servers:csv}` 

 Weitere Informationen zu den Formatierungsoptionen für Variablen finden Sie unter[Vorlagen und Variablen](templates-and-variables.md). 

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

 Mithilfe von Anmerkungen können Sie Grafiken mit ausführlichen Ereignisinformationen überlagern. Sie fügen Annotationsabfragen über das Dashboard-Menü /die Ansicht Anmerkungen hinzu. Weitere Informationen finden Sie unter [Anmerkungen](dashboard-annotations.md). 

 **Spalten:** 


|  Name  |  Description  | 
| --- | --- | 
|  time  |  Der Name des date/time Feldes. Könnte eine Spalte mit einem systemeigenen date/time SQL-Datentyp oder Epochenwert sein.  | 
|  timeend  |  Optionaler Name des date/time Endfeldes. Könnte eine Spalte mit einem systemeigenen date/time SQL-Datentyp oder Epochenwert sein.  | 
|  text  |  Feld mit der Beschreibung des Ereignisses.  | 
|  tags  |  Optionaler Feldname, der für Event-Tags als kommagetrennte Zeichenfolge verwendet werden soll.  | 

 Der folgende Beispielcode zeigt Datenbanktabellen. 

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

 Wir verwenden auch die in definierte Datenbanktabelle[Zeitreihenabfragen](#mssql-time-series-queries). 

 Der folgende Beispielcode zeigt eine Abfrage, die eine Zeitspalte mit Epochenwerten verwendet. 

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

 Der folgende Beispielcode zeigt eine Regionsabfrage, die Zeit- und Zeitendspalten mit Epochenwerten verwendet. 

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

 Der folgende Beispielcode zeigt eine Abfrage, die eine Zeitspalte des systemeigenen date/time SQL-Datentyps verwendet. 

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

## Unterstützung für gespeicherte Prozeduren
<a name="stored-procedure-support"></a>

 Es wurde verifiziert, dass gespeicherte Prozeduren funktionieren. Es kann jedoch Randfälle geben, in denen es nicht wie erwartet funktioniert. Gespeicherte Prozeduren sollten in Tabellen-, Zeitreihen- und Annotationsabfragen unterstützt werden, solange Sie dieselbe Benennung von Spalten verwenden und Daten im gleichen Format zurückgeben, wie zuvor in den jeweiligen Abschnitten beschrieben. 

 Makrofunktionen funktionieren nicht innerhalb einer gespeicherten Prozedur. 

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

 In den folgenden Beispielen ist die Datenbanktabelle in Zeitreihenabfragen definiert. Nehmen wir an, Sie möchten vier Reihen in einem Grafikfeld visualisieren, z. B. alle Kombinationen von Spalten `valueOne` `valueTwo` und`measurement`. Das Grafikfeld auf der rechten Seite visualisiert, was wir erreichen wollen. Um dieses Problem zu lösen, müssen Sie zwei Abfragen verwenden: 

 Der folgende Beispielcode zeigt die erste Abfrage. 

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

 Der folgende Beispielcode zeigt die zweite Abfrage. 

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

#### Gespeicherte Prozedur, die Zeit im Epochenformat verwendet
<a name="mssql-stored-procedure-using-time-in-epoch-format"></a>

 Sie können eine gespeicherte Prozedur definieren, die alle Daten zurückgibt, die Sie zum Rendern von vier Serien in einem Grafikfeld wie oben benötigen. In diesem Fall akzeptiert die gespeicherte Prozedur zwei Parameter `@from` und `@to` `int` Datentypen, bei denen es sich um einen Zeitraum (von bis) im Epochenformat handeln sollte, der verwendet wird, um die Daten zu filtern, die von der gespeicherten Prozedur zurückgegeben werden sollen. 

 Dies ahmt die Ausdrücke `$__timeGroup(time, '5m')` in den Ausdrücken „Auswählen“ und „Gruppieren nach“ nach, weshalb zahlreiche lange Ausdrücke benötigt werden. Diese könnten bei Bedarf in MSSQL-Funktionen extrahiert werden.

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

 Dann können Sie die folgende Abfrage für Ihr Grafikpanel verwenden. 

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

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

#### Gespeicherte Prozedur, die Uhrzeit im Datetime-Format verwendet
<a name="mssql-stored-procedure-using-time-in-datetime-format"></a>

 Sie können eine gespeicherte Prozedur definieren, die alle Daten zurückgibt, die Sie zum Rendern von vier Serien in einem Grafikfeld wie oben benötigen. In diesem Fall akzeptiert die gespeicherte Prozedur zwei Parameter `@from` und `@to` `datetime` Datentypen, bei denen es sich um einen Zeitraum (von-bis) handeln sollte, der verwendet wird, um die Daten zu filtern, die aus der gespeicherten Prozedur zurückgegeben werden sollen. 

 Dies ahmt die Ausdrücke `$__timeGroup(time, '5m')` in den Ausdrücken „Auswählen“ und „Gruppieren nach“ nach, weshalb zahlreiche lange Ausdrücke benötigt werden. Diese könnten bei Bedarf in MSSQL-Funktionen extrahiert werden. 

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

 Dann können Sie die folgende Abfrage für Ihr Grafikpanel verwenden. 

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

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

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

 Zeitreihenabfragen sollten unter Alarmbedingungen funktionieren. Abfragen im Tabellenformat werden in Warnungsregelbedingungen noch nicht unterstützt. 