sql >> Databasteknik >  >> RDS >> Sqlserver

Hur SESSION_CONTEXT() fungerar i SQL Server

I SQL Server kan du använda SESSION_CONTEXT() funktion för att läsa värdet på en angiven nyckel i den aktuella sessionskontexten.

Nyckeln (nyckel/värdepar) måste ställas in först. Detta kan göras med sp_set_session_context lagrad procedur.

När ett nyckel-/värdepar har ställts in för sessionen kan du använda SESSION_CONTEXT() för att returnera nyckelns värde.

Exempel 1 – Ange och returnera värdet

Här är ett exempel som visar det grundläggande konceptet och användningen.

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

SELECT SESSION_CONTEXT(N'user_id') AS user_id;

Resultat:

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

Exempel 2 – När en nyckel inte finns

Det här är vad som händer om du försöker få värdet från en nyckel som inte finns.

SELECT SESSION_CONTEXT(N'oops') AS oops;

Resultat:

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

Exempel 3 – Prefixet "N"

Argumentet till SESSION_CONTEXT() är av typen sysname . I grund och botten är detta detsamma som nvarchar(128) NOT NULL , vilket betyder att du måste prefixa argumentet med N tecken.

Här är vad som händer om jag tar bort N prefix:

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

SELECT SESSION_CONTEXT('language') AS language;

Resultat:

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

Genom att ta bort N prefix, jag passerar helt enkelt i en varchar , när det ska vara nvarchar (eller sysname för att vara exakt).

Här är den med N prefix:

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

SELECT SESSION_CONTEXT(N'language') AS language;

Resultat:

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

Exempel 4 – Returvärdet

Returtypen för SESSION_CONTEXT() är sql_variant .

Du kan använda SQL_VARIANT_PROPERTY() funktion för att ta reda på bastypen.

Exempel:

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

Resultat:

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

Exempel 5 – Sammanfoga returvärden

Om du behöver sammanfoga flera resultat måste du konvertera resultaten till en annan datatyp än sql_variant först.

Här är ett exempel på vad som händer om jag inte gör det här:

Exempel:

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

Resultat:

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.

Så jag måste explicit konvertera resultaten med antingen CAST() eller CONVERT() innan du sammanfogar dem.

Exempel:

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;

Resultat:

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

  1. Skicka flera värden i en enda parameter

  2. MySQL - Styr vilken rad som returneras av en grupp av

  3. Utforska lagringsmotoralternativ för MariaDB

  4. Hur man jämför två tabeller i MySQL