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