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