Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como SESSION_CONTEXT() funciona no SQL Server


No SQL Server, você pode usar o SESSION_CONTEXT() função para ler o valor de uma chave especificada no contexto da sessão atual.

A chave (par chave/valor) precisa ser definida primeiro. Isso pode ser feito com o sp_set_session_context procedimento armazenado.

Uma vez que um par chave/valor foi definido para a sessão, você pode usar SESSION_CONTEXT() para retornar o valor dessa chave.


Exemplo 1 – Definir e retornar o valor


Aqui está um exemplo que demonstra o conceito básico e o uso.
EXEC sp_set_session_context
  @key = N'user_id',
  @value = 15;

SELECT SESSION_CONTEXT(N'user_id') AS user_id;

Resultado:
+-----------+
| user_id   |
|-----------|
| 15        |
+-----------+

Exemplo 2 – Quando uma chave não existe


Aqui está o que acontece se você tentar obter o valor de uma chave que não existe.
SELECT SESSION_CONTEXT(N'oops') AS oops;

Resultado:
+--------+
| oops   |
|--------|
| NULL   |
+--------+

Exemplo 3 – O prefixo “N”


O argumento fornecido para SESSION_CONTEXT() é do tipo sysname . Basicamente, isso é o mesmo que nvarchar(128) NOT NULL , o que significa que você precisa prefixar o argumento com o N personagem.

Veja o que acontece se eu remover o N prefixo:
EXEC sp_set_session_context
  @key = 'language',
  @value = 'English';

SELECT SESSION_CONTEXT('language') AS language;

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

Ao remover o N prefixo, estou simplesmente passando um varchar , quando deveria ser nvarchar (ou nomedosistema para ser exato).

Aqui está com o N prefixo:
EXEC sp_set_session_context
  @key = N'language',
  @value = 'English';

SELECT SESSION_CONTEXT(N'language') AS language;

Resultado:
+------------+
| language   |
|------------|
| English    |
+------------+

Exemplo 4 – O valor de retorno


O tipo de retorno de SESSION_CONTEXT() é sql_variant .

Você pode usar o SQL_VARIANT_PROPERTY() função para descobrir o tipo de base.

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

Resultado:
+-----------+------------+
| user_id   | language   |
|-----------+------------|
| int       | varchar    |
+-----------+------------+

Exemplo 5 – Concatenar valores de retorno


Se você precisar concatenar vários resultados, precisará converter os resultados em um tipo de dados diferente de sql_variant primeiro.

Aqui está um exemplo do que acontece se eu não fizer isso:

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

Resultado:
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.

Então eu preciso converter explicitamente os resultados usando CAST() ou CONVERT() antes de concatená-los.

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

Resultado:
+--------------+
| Result       |
|--------------|
| HomerSimpson |
+--------------+