CONTEXT_INFO
имеет фиксированную длину binary(128)
, а не varbinary(128)
.Ошибка синтаксического анализа связана с вычислением конечных двоичных нулей.
Вместо CONTEXT_INFO
рассмотрите возможность использования SESSION_CONTEXT
(доступно в SQL Server 2016 и далее).SESSION_CONTEXT
позволяет хранить одну или несколько пар ключ / значение с типом ключа sysname
(nvarchar(128)
) и значением типа sql_variant
с sp_set_session_context
.Значение можно получить с помощью функции SESSION_CONTEXT
.
Поэтому, если вашей основной целью является сохранение и извлечение значений пользователя, журнала и культуры, вы можете создать SESSION_CONTEXT
записей для 3 значений вместоXML
:
EXEC sp_set_session_context @key= N'User', @value= 'system';
EXEC sp_set_session_context @key= N'Log', @value= 1;
EXEC sp_set_session_context @key= N'Culture', @value= 1;
SELECT SESSION_CONTEXT(N'User'), SESSION_CONTEXT(N'Log'), SESSION_CONTEXT(N'Culture');
В качестве альтернативы вы можете использовать XML аналогично исходной попытке, но, поскольку XML
не является разрешенным типом sql_variant
, вам нужно добавить значение XML
какvarchar / nvarchar и CAST
до XML
:
DECLARE @xml XML = '<row User="system" Log="1" Culture="1"/>';
DECLARE @xmlVarchar varchar(8000) = CAST(@xml AS varchar(8000));
EXEC sp_set_session_context @key= N'xml', @value= @xmlVarchar;
SELECT CAST(CAST(SESSION_CONTEXT(N'xml') AS varchar(8000)) AS xml);