let-Anweisung

Eine let-Anweisung wird verwendet, um einen Variablennamen festzulegen, der einem Ausdruck oder einer Funktion entspricht, oder um Ansichten zu erstellen.

let-Anweisungen sind hilfreich beim:

  • Unterteilen eines komplexen Ausdrucks in mehrere Teile, die jeweils durch eine Variable dargestellt werden.
  • Definieren von Konstanten außerhalb des Abfragetexts zur Lesbarkeit.
  • Einmaligen Definieren einer Variablen und bei mehrfacher Verwendung innerhalb einer Abfrage.

Wenn die Variable zuvor einen anderen Wert hatte, z. B. in geschachtelten Anweisungen, gilt die innerste let-Anweisung.

Informationen zum Optimieren mehrerer Verwendungsmöglichkeiten der let-Anweisung innerhalb einer einzelnen Abfrage finden Sie unter Optimieren von Abfragen, die benannte Ausdrücke verwenden.

Hinweis

Die let-Anweisung bindet einen Namen an eine Berechnung, nicht an den ausgewerteten Wert dieser Berechnung. Dieses Verhalten bedeutet, dass mehrere Verweise auf denselben Namen unterschiedliche Werte zurückgeben können, da die Berechnung mehrfach ausgewertet wird. Wenn dies nicht das gewünschte Verhalten ist, verwenden Sie toscalar() oder materialize().

Syntax: Skalare oder tabellarische Ausdrücke

letName=Ausdruck

Wichtig

Let-Anweisungen muss ein Semikolon folgen. Zwischen Let-Anweisungen oder zwischen Let-Anweisungen und anderen Abfrageanweisungen können keine Leerzeilen vorhanden sein.

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Typ Erforderlich BESCHREIBUNG
Name string ✔️ Der Variablenname. Sie können den Namen mit Klammern versehen. Beispiel: ["Name with spaces"].
Ausdruck string ✔️ Ein Ausdruck mit einem skalaren oder tabellarischen Ergebnis. Ein Ausdruck mit einem skalaren Ergebnis wäre z. B. let one=1;, und ein Ausdruck mit einem tabellarischen Ergebnis wäre let RecentLog = Logs | where Timestamp > ago(1h).

Syntax: Ansicht oder Funktion

letName= [view] ([ Parameter ]){Funktionstext}

Wichtig

Let-Anweisungen muss ein Semikolon folgen. Zwischen Let-Anweisungen oder zwischen Let-Anweisungen und anderen Abfrageanweisungen können keine Leerzeilen vorhanden sein.

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Typ Erforderlich BESCHREIBUNG
FunctionBody string ✔️ Ein Ausdruck, der eine benutzerdefinierte Funktion ergibt.
view string Nur relevant für eine parameterlose let-Anweisung. Wenn die let-Anweisung verwendet wird, wird sie in Abfragen mit einem union-Operator einbezogen und für die Tabellen/Ansichten wird ein Platzhalter ausgewählt. Ein Beispiel finden Sie unter Erstellen einer Ansicht oder einer virtuellen Tabelle.
Parameter string Null oder mehr kommagetrennte Tabellen- oder Skalarfunktionsparameter.

Für Parameter des tabellarischen Typs muss der Parameter das Format Tabellenname:Tabellenschema aufweisen, wobei Tabellenschema entweder eine kommagetrennte Liste von Spalten im Format Spaltenname:Spaltentyp oder ein Platzhalter (*) ist. Wenn Spalten angegeben werden, muss das eingegebene tabellarische Argument diese Spalten enthalten. Bei Angabe eines Platzhalters kann das eingegebene tabellarische Argument ein beliebiges Schema aufweisen. Um auf Spalten im Funktionstext zu verweisen, müssen sie angegeben werden. Beispiele finden Sie unter Tabellarisches Argument mit Schema sowie unter Tabellarisches Argument mit Platzhalter.

Geben Sie für jeden Parameter des Skalartyps den Parameternamen und den Parametertyp im Format Name:Typ an. Der Name kann im FunctionBody angezeigt werden und ist an einen bestimmten Wert gebunden, wenn die benutzerdefinierte Funktion aufgerufen wird. Die einzigen unterstützten Typen sind bool, string, long, datetime, timespan, real und dynamicsowie die Aliase für diese Typen.

Hinweis

  • Tabellarische Parameter müssen sich vor Skalarparametern befinden.
  • Zwei Anweisungen müssen durch ein Semikolon getrennt werden.

Beispiele

Definieren skalarer Werte

Im folgenden Beispiel wird eine skalare Ausdrucksanweisung verwendet.

let n = 10;  // number
let place = "Dallas";  // string
let cutoff = ago(62d); // datetime 
Events 
| where timestamp > cutoff 
    and city == place 
| take n

Im folgenden Beispiel wird der Name some number mithilfe der Notation ['name'] gebunden und dann in einer tabellarischen Ausdrucksanweisung verwendet.

let ['some number'] = 20;
range y from 0 to ['some number'] step 5

Erstellen einer benutzerdefinierten Funktion mit skalarer Berechnung

Dieses Beispiel verwendet die let-Anweisung mit Argumenten für die Skalarberechnung. Die Abfrage definiert Funktion MultiplyByN für die Multiplikation von zwei Zahlen.

let MultiplyByN = (val:long, n:long) { val * n };
range x from 1 to 5 step 1 
| extend result = MultiplyByN(x, 5)

Ausgabe

x result
1 5
2 10
3 15
4 20
5 25

Erstellen einer benutzerdefinierten Funktion, die Eingaben kürzt

Im folgenden Beispiel werden führende/nachfolgende Einsen aus der Eingabe entfernt.

let TrimOnes = (s:string) { trim("1", s) };
range x from 10 to 15 step 1 
| extend result = TrimOnes(tostring(x))

Ausgabe

x result
10 0
11
12 2
13 3
14 4
15 5

Verwenden mehrerer let-Anweisungen

In diesem Beispiel werden zwei let-Anweisungen definiert, wobei eine Anweisung (foo2) eine andere Anweisung (foo1) verwendet.

let foo1 = (_start:long, _end:long, _step:long) { range x from _start to _end step _step};
let foo2 = (_step:long) { foo1(1, 100, _step)};
foo2(2) | count

Ausgabe

result
50

Erstellen einer Ansicht oder einer virtuellen Tabelle

In diesem Beispiel wird gezeigt, wie Sie eine let-Anweisung verwenden, um eine oder eine view oder eine virtuelle Tabelle zu erstellen.

let Range10 = view () { range MyColumn from 1 to 10 step 1 };
let Range20 = view () { range MyColumn from 1 to 20 step 1 };
search MyColumn == 5

Ausgabe

$table MyColumn
Range10 5
Range20 5

Verwenden der materialize-Funktion

Mit der materialize()-Funktion können Sie Ergebnisse von Unterabfragen während der Zeit der Abfrageausführung zwischenspeichern. Wenn Sie die materialize()-Funktion verwenden, werden die Daten zwischengespeichert, und jeder nachfolgende Aufruf des Ergebnisses verwendet zwischengespeicherte Daten.

let totalPagesPerDay = PageViews
| summarize by Page, Day = startofday(Timestamp)
| summarize count() by Day;
let materializedScope = PageViews
| summarize by Page, Day = startofday(Timestamp);
let cachedResult = materialize(materializedScope);
cachedResult
| project Page, Day1 = Day
| join kind = inner
(
    cachedResult
    | project Page, Day2 = Day
)
on Page
| where Day2 > Day1
| summarize count() by Day1, Day2
| join kind = inner
    totalPagesPerDay
on $left.Day1 == $right.Day
| project Day1, Day2, Percentage = count_*100.0/count_1

Ausgabe

Tag1 Tag2 Prozentwert
2016-05-01 00:00:00.0000000 2016-05-02 00:00:00.0000000 34.0645725975255
2016-05-01 00:00:00.0000000 2016-05-03 00:00:00.0000000 16.618368960101
2016-05-02 00:00:00.0000000 2016-05-03 00:00:00.0000000 14.6291376489636

Verwenden geschachtelter let-Anweisungen

Geschachtelte let-Anweisungen sind zulässig, auch innerhalb eines benutzerdefinierten Funktionsausdrucks. Let-Anweisungen und -Argumente sind im aktuellen und inneren Gültigkeitsbereich des Funktionstexts sichtbar.

let start_time = ago(5h); 
let end_time = start_time + 2h; 
T | where Time > start_time and Time < end_time | ...

Tabellarisches Argument mit Schema

Im folgenden Beispiel wird angegeben, dass der Tabellenparameter T über die Spalte State vom Typ stringverfügen muss. Die Tabelle T kann auch andere Spalten enthalten, aber in der Funktion StateState kann nicht auf sie verwiesen werden, da sie nicht deklariert sind.

let StateState=(T: (State: string)) { T | extend s_s=strcat(State, State) };
StormEvents
| invoke StateState()
| project State, s_s

Ausgabe

State s_s
ATLANTIC SOUTH ATLANTIC SOUTHATLANTIC SOUTH
FLORIDA FLORIDAFLORIDA
FLORIDA FLORIDAFLORIDA
GEORGIA GEORGIAGEORGIA
MISSISSIPPI MISSISSIPPIMISSISSIPPI
... ...

Tabellarisches Argument mit Platzhalter

Der Tabellenparameter T kann ein beliebiges Schema aufweisen, und die Funktion CountRecordsInTable funktioniert.

let CountRecordsInTable=(T: (*)) { T | count };
StormEvents | invoke CountRecordsInTable()

Ausgabe

Anzahl
59.066