sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan fungerer SESSION_CONTEXT() i SQL Server

I SQL Server kan du bruge SESSION_CONTEXT() funktion til at læse værdien af ​​en specificeret nøgle i den aktuelle sessionskontekst.

Nøglen (nøgle/værdi-par) skal indstilles først. Dette kan gøres med sp_set_session_context gemt procedure.

Når et nøgle/værdi-par er blevet indstillet til sessionen, kan du bruge SESSION_CONTEXT() for at returnere nøglens værdi.

Eksempel 1 – Indstil og returner værdien

Her er et eksempel, der demonstrerer det grundlæggende koncept og brugen.

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

SELECT SESSION_CONTEXT(N'user_id') AS user_id;

Resultat:

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

Eksempel 2 – Når en nøgle ikke eksisterer

Her er, hvad der sker, hvis du forsøger at få værdien fra en nøgle, der ikke eksisterer.

SELECT SESSION_CONTEXT(N'oops') AS oops;

Resultat:

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

Eksempel 3 – "N"-præfikset

Argumentet til SESSION_CONTEXT() er af typen sysname . Grundlæggende er dette det samme som nvarchar(128) NOT NULL , hvilket betyder, at du skal præfikse argumentet med N tegn.

Her er, hvad der sker, hvis jeg fjerner N præfiks:

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.

Ved at fjerne N præfiks, passerer jeg simpelthen en varchar , når det skal være nvarchar (eller sysname for at være præcis).

Her er den med N præfiks:

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

SELECT SESSION_CONTEXT(N'language') AS language;

Resultat:

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

Eksempel 4 – Returneringsværdien

Returtypen SESSION_CONTEXT() er sql_variant .

Du kan bruge SQL_VARIANT_PROPERTY() funktion for at finde ud af basistypen.

Eksempel:

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

Eksempel 5 – Sammenkædning af returværdier

Hvis du har brug for at sammenkæde flere resultater, skal du konvertere resultaterne til en anden datatype end sql_variant først.

Her er et eksempel på, hvad der sker, hvis jeg ikke gør dette:

Eksempel:

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å jeg skal eksplicit konvertere resultaterne ved at bruge enten CAST() eller CONVERT() før du sammenkæder dem.

Eksempel:

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. Sådan viser du filer i en mappe med SQL Server

  2. Dataprofilering:Opdagelse af datadetaljer

  3. Softwaregennemgang – Stellar Repair til MS SQL

  4. Er der en automatisk ændringstidsstempeltype for Oracle-kolonner?