sql >> Databáze >  >> RDS >> Sqlserver

Jak funguje SESSION_CONTEXT() na serveru SQL Server

V SQL Server můžete použít SESSION_CONTEXT() funkce pro čtení hodnoty zadaného klíče v kontextu aktuální relace.

Nejprve je třeba nastavit klíč (pár klíč/hodnota). To lze provést pomocí sp_set_session_context uložené procedury.

Jakmile je pro relaci nastaven pár klíč/hodnota, můžete použít SESSION_CONTEXT() vrátit hodnotu tohoto klíče.

Příklad 1 – Nastavení a vrácení hodnoty

Zde je příklad, který demonstruje základní koncept a použití.

EXEC sp_set_session_context @key =N'user_id', @value =15;SELECT SESSION_CONTEXT(N'user_id') AS user_id;

Výsledek:

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

Příklad 2 – Když klíč neexistuje

Co se stane, když se pokusíte získat hodnotu z klíče, který neexistuje.

SELECT SESSION_CONTEXT(N'oops') JAKO Jejda;

Výsledek:

+---------+| jejda ||---------|| NULL |+--------+

Příklad 3 – Předpona „N“

Argument poskytnutý SESSION_CONTEXT() je typu sysname . V podstatě je to stejné jako nvarchar(128) NOT NULL , což znamená, že před argument musíte přidat N postava.

Zde je to, co se stane, když odstraním N prefix:

EXEC sp_set_session_context @key ='jazyk', @value ='angličtina';SELECT SESSION_CONTEXT('language') JAKO jazyk;

Výsledek:

Zpráva 8116, úroveň 16, stav 1, řádek 5 Datový typ argumentu varchar je neplatný pro argument 1 funkce session_context.

Odebráním N prefix, jednoduše předávám varchar , kdy by měl být nvarchar (nebo název systému být přesný).

Tady je to s N prefix:

EXEC sp_set_session_context @key =N'language', @value ='Angličtina';SELECT SESSION_CONTEXT(N'language') JAKO jazyk;

Výsledek:

+-------------+| jazyk ||-------------|| anglicky |+------------+

Příklad 4 – Návratová hodnota

Návratový typ SESSION_CONTEXT() je sql_variant .

Můžete použít SQL_VARIANT_PROPERTY() funkce pro zjištění základního typu.

Příklad:

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

Výsledek:

+-----------+------------+| user_id | jazyk ||-----------+------------|| int | varchar |+-----------+------------+

Příklad 5 – Zřetězení návratových hodnot

Pokud potřebujete zřetězit více výsledků, budete muset výsledky převést na jiný datový typ než sql_variant za prvé.

Zde je příklad toho, co se stane, když to neudělám:

Příklad:

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> 

Výsledek:

Zpráva 257, úroveň 16, stav 3, řádek 1 Implicitní převod z datového typu sql_variant na varchar není povolen. Ke spuštění tohoto dotazu použijte funkci CONVERT.

Potřebuji tedy explicitně převést výsledky buď pomocí CAST() nebo CONVERT() před jejich zřetězením.

Příklad:

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;

Výsledek:

+---------------+| Výsledek ||---------------|| HomerSimpson |+--------------+

  1. Nelze svázat argument na indexu 2, protože index je mimo rozsah

  2. Proč si Oracle 10g nestěžuje na nejednoznačnost sloupců?

  3. oracle diff:jak porovnat dvě tabulky?

  4. Najít a nahradit regulární výraz v Postgresu