Как преобразовать возвращаемое значение context_info в xml - PullRequest
0 голосов
/ 12 мая 2019

Как мне выполнить приведение / преобразование context_info данных возвращаемого значения в XML?

Первый запрос работает нормально, а query2 не работает

-- Query 1
DECLARE @xml XML = '<row User="system" Log="1" Culture="1"/>'
DECLARE @varB VARBINARY(128);

SET @varB = CAST(@xml AS VARBINARY(128)) 

SELECT @xml, CAST(@varB AS XML)

-- Query 2
DECLARE @xml XML = '<row User="system" Log="1" Culture="1"/>'
DECLARE @varB VARBINARY(128);

SET @varB = CAST(@xml AS VARBINARY(128)) 

SET CONTEXT_INFO  @varB

SELECT @xml, CAST(@varB AS XML), CONTEXT_INFO(), CAST(CONTEXT_INFO() AS XML)

Ошибка:

Синтаксический анализ XML: строка 1, символ 41, недопустимый символ xml

1 Ответ

0 голосов
/ 12 мая 2019

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);
...