Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak SESSION_CONTEXT() działa w SQL Server

W SQL Server możesz użyć SESSION_CONTEXT() funkcja odczytu wartości określonego klucza w kontekście bieżącej sesji.

Najpierw należy ustawić klucz (para klucz/wartość). Można to zrobić za pomocą sp_set_session_context procedura składowana.

Po ustawieniu pary klucz/wartość dla sesji możesz użyć SESSION_CONTEXT() aby zwrócić wartość tego klucza.

Przykład 1 – Ustaw i zwróć wartość

Oto przykład, który demonstruje podstawową koncepcję i zastosowanie.

EXEC sp_set_session_context @key =N'identyfikator_użytkownika', @wartość =15;WYBIERZ SESJĘ_CONTEXT(N'identyfikator_użytkownika') AS user_id;

Wynik:

+-----------+| identyfikator_użytkownika ||-----------|| 15 |+-----------+

Przykład 2 – Kiedy klucz nie istnieje

Oto, co się stanie, jeśli spróbujesz uzyskać wartość z klucza, który nie istnieje.

SELECT SESSION_CONTEXT(N'Ups') AS ups;

Wynik:

+--------+| ups ||--------|| NULL |+--------+

Przykład 3 – Przedrostek „N”

Argument dostarczony do SESSION_CONTEXT() jest typu sysname . Zasadniczo jest to to samo, co nvarchar(128) NOT NULL , co oznacza, że ​​musisz poprzedzić argument N znak.

Oto, co się stanie, jeśli usunę N prefiks:

EXEC sp_set_session_context @key ='język', @value ='angielski';WYBIERZ SESSION_CONTEXT('język') AS;

Wynik:

Msg 8116, Level 16, State 1, Line 5Argument typ danych varchar jest nieprawidłowy dla argumentu 1 funkcji session_context.

Usuwając N prefiks, po prostu przekazuję varchar , kiedy powinno być nvarchar (lub nazwa systemu byc dokładnym).

Tutaj jest z N prefiks:

EXEC sp_set_session_context @key =N'język', @value ='angielski';WYBIERZ SESSION_CONTEXT(N'język') AS;

Wynik:

+----------------+| język ||------------|| angielski |+------------+

Przykład 4 – Wartość zwrotu

Zwracany typ SESSION_CONTEXT() to sql_variant .

Możesz użyć SQL_VARIANT_PROPERTY() funkcja, aby znaleźć typ bazy.

Przykład:

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

Wynik:

+-----------+------------+| identyfikator_użytkownika | język ||-----------+------------|| int | varchar |+-----------+----------------+

Przykład 5 – Łączenie wartości zwracanych

Jeśli chcesz połączyć wiele wyników, musisz je przekonwertować na typ danych inny niż sql_variant pierwszy.

Oto przykład tego, co się stanie, jeśli tego nie zrobię:

Przykład:

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') pre AS Result;> 

Wynik:

Msg 257, poziom 16, stan 3, wiersz 1 Niejawna konwersja typu danych sql_variant na varchar nie jest dozwolona. Użyj funkcji CONVERT, aby uruchomić to zapytanie.

Więc muszę jawnie przekonwertować wyniki za pomocą CAST() lub CONVERT() przed ich połączeniem.

Przykład:

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) nazwa_użytkownika') AS varchar(7)) ) AS Wynik;

Wynik:

+--------------+| Wynik ||--------------|| HomerSimpson |+---------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Audyt danych w NHibernate i SqlServer

  2. Dlaczego i kiedy LEFT JOIN z warunkiem w klauzuli WHERE nie jest równoznaczny z tym samym LEFT JOIN w klauzuli ON?

  3. Jak mogę wyczyścić pamięć podręczną zapytań programu SQL Server?

  4. Jak wykonać IF...THEN w SQL SELECT?

  5. Przewodnik po CTE w SQL Server