sql >> Database >  >> RDS >> Sqlserver

Hoe SESSION_CONTEXT() werkt in SQL Server

In SQL Server kunt u de SESSION_CONTEXT() functie om de waarde van een gespecificeerde sleutel in de huidige sessiecontext te lezen.

De sleutel (sleutel/waarde-paar) moet eerst worden ingesteld. Dit kan gedaan worden met de sp_set_session_context opgeslagen procedure.

Zodra een sleutel/waarde-paar is ingesteld voor de sessie, kunt u SESSION_CONTEXT() gebruiken om de waarde van die sleutel te retourneren.

Voorbeeld 1 - De waarde instellen en retourneren

Hier is een voorbeeld dat het basisconcept en gebruik demonstreert.

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

SELECT SESSION_CONTEXT(N'user_id') AS user_id;

Resultaat:

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

Voorbeeld 2 – Wanneer een sleutel niet bestaat

Dit is wat er gebeurt als je de waarde probeert te krijgen van een sleutel die niet bestaat.

SELECT SESSION_CONTEXT(N'oops') AS oops;

Resultaat:

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

Voorbeeld 3 – Het voorvoegsel “N”

Het argument geleverd aan SESSION_CONTEXT() is van het type sysname . In principe is dit hetzelfde als nvarchar(128) NOT NULL , wat betekent dat je het argument moet voorvoegen met de N karakter.

Dit gebeurt er als ik de N . verwijder voorvoegsel:

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

SELECT SESSION_CONTEXT('language') AS language;

Resultaat:

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

Door de N . te verwijderen prefix, ik geef gewoon een varchar door , terwijl het nvarchar . zou moeten zijn (of sysname Om precies te zijn).

Hier is het met de N voorvoegsel:

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

SELECT SESSION_CONTEXT(N'language') AS language;

Resultaat:

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

Voorbeeld 4 – De retourwaarde

Het retourtype van SESSION_CONTEXT() is sql_variant .

U kunt de SQL_VARIANT_PROPERTY() . gebruiken functie om het basistype te achterhalen.

Voorbeeld:

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

Resultaat:

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

Voorbeeld 5 – Retourwaarden aaneenschakelen

Als u meerdere resultaten moet samenvoegen, moet u de resultaten converteren naar een ander gegevenstype dan sql_variant eerst.

Hier is een voorbeeld van wat er gebeurt als ik dit niet doe:

Voorbeeld:

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

Resultaat:

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.

Dus ik moet de resultaten expliciet converteren met behulp van CAST() of CONVERT() voordat u ze samenvoegt.

Voorbeeld:

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;

Resultaat:

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

  1. Hitmarkering bij zoeken in volledige tekst

  2. Hoe een substring selecteren in Oracle SQL tot een specifiek teken?

  3. Moet alle triggers in de SQL Server-database vermelden met tabelnaam en tabelschema

  4. Wat is het doel van gegevensreplicatie?