Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise von SESSION_CONTEXT() in SQL Server

In SQL Server können Sie SESSION_CONTEXT() verwenden Funktion, um den Wert eines angegebenen Schlüssels im aktuellen Sitzungskontext zu lesen.

Der Schlüssel (Schlüssel/Wert-Paar) muss zuerst festgelegt werden. Dies kann mit dem sp_set_session_context erfolgen gespeicherte Prozedur.

Sobald ein Schlüssel/Wert-Paar für die Sitzung festgelegt wurde, können Sie SESSION_CONTEXT() verwenden um den Wert dieses Schlüssels zurückzugeben.

Beispiel 1 – Setzen und Zurückgeben des Werts

Hier ist ein Beispiel, das das grundlegende Konzept und die Verwendung demonstriert.

EXEC sp_set_session_context
  @key = N'user_id',
  @value = 15;

SELECT SESSION_CONTEXT(N'user_id') AS user_id;

Ergebnis:

+-----------+
| user_id   |
|-----------|
| 15        |
+-----------+

Beispiel 2 – Wenn ein Schlüssel nicht existiert

Folgendes passiert, wenn Sie versuchen, den Wert von einem Schlüssel abzurufen, der nicht existiert.

SELECT SESSION_CONTEXT(N'oops') AS oops;

Ergebnis:

+--------+
| oops   |
|--------|
| NULL   |
+--------+

Beispiel 3 – Das „N“-Präfix

Das für SESSION_CONTEXT() bereitgestellte Argument ist vom Typ sysname . Im Grunde ist dies dasselbe wie nvarchar(128) NOT NULL , was bedeutet, dass Sie dem Argument das N voranstellen müssen Zeichen.

Folgendes passiert, wenn ich das N entferne Präfix:

EXEC sp_set_session_context
  @key = 'language',
  @value = 'English';

SELECT SESSION_CONTEXT('language') AS language;

Ergebnis:

Msg 8116, Level 16, State 1, Line 5
Argument data type varchar is invalid for argument 1 of session_context function.

Durch Entfernen des N Präfix übergebe ich einfach ein varchar , wenn es nvarchar sein sollte (oder sysname um genau zu sein).

Hier ist es mit dem N Präfix:

EXEC sp_set_session_context
  @key = N'language',
  @value = 'English';

SELECT SESSION_CONTEXT(N'language') AS language;

Ergebnis:

+------------+
| language   |
|------------|
| English    |
+------------+

Beispiel 4 – Der Rückgabewert

Der Rückgabetyp von SESSION_CONTEXT() ist sql_variant .

Sie können SQL_VARIANT_PROPERTY() verwenden Funktion, um den Basistyp herauszufinden.

Beispiel:

SELECT 
  SQL_VARIANT_PROPERTY(
      SESSION_CONTEXT(N'user_id'), 'BaseType'
      ) AS user_id,
  SQL_VARIANT_PROPERTY(
      SESSION_CONTEXT(N'language'), 'BaseType'
      ) AS language;

Ergebnis:

+-----------+------------+
| user_id   | language   |
|-----------+------------|
| int       | varchar    |
+-----------+------------+

Beispiel 5 – Verketten von Rückgabewerten

Wenn Sie mehrere Ergebnisse verketten müssen, müssen Sie die Ergebnisse in einen anderen Datentyp als sql_variant konvertieren Erste.

Hier ist ein Beispiel dafür, was passiert, wenn ich dies nicht tue:

Beispiel:

EXEC sp_set_session_context N'user_fname', 'Homer';
EXEC sp_set_session_context N'user_lname', 'Simpson';

SELECT 
  CONCAT(
      SESSION_CONTEXT(N'user_fname'), 
      SESSION_CONTEXT(N'user_lname')
      ) AS Result;

Ergebnis:

Msg 257, Level 16, State 3, Line 1
Implicit conversion from data type sql_variant to varchar is not allowed. Use the CONVERT function to run this query.

Also muss ich die Ergebnisse explizit konvertieren, indem ich entweder CAST() verwende oder CONVERT() bevor Sie sie verketten.

Beispiel:

EXEC sp_set_session_context N'user_fname', 'Homer';
EXEC sp_set_session_context N'user_lname', 'Simpson';

SELECT 
  CONCAT(
      CAST(SESSION_CONTEXT(N'user_fname') AS varchar(5)),
      CAST(SESSION_CONTEXT(N'user_lname') AS varchar(7))
      ) AS Result;

Ergebnis:

+--------------+
| Result       |
|--------------|
| HomerSimpson |
+--------------+