Заявление SqlServer XML DML преобразует символ дельты в вопросительный знак

У меня есть столбец xml в таблице. Когда я вставляю xml в таблицу, все символы в xml нормальные. Но когда я пытаюсь вставить узел в xml с помощью оператора Xml DML, если этот узел имеет такие символы, как «Дельта», SqlServer преобразует их в вопросительный знак. Кто-нибудь может подсказать, как решить эту проблему?

Вот пример кода:

-- 1. Создать таблицу
CREATE TABLE SAMPLE_XML (ID INT IDENTITY, информация xml);

-- 2. Создайте хранимую процедуру для вставки данных в таблицу.

CREATE PROCEDURE [dbo].[SET_SAMPLEXML]
@Information xml
AS
BEGIN
    INSERT INTO SAMPLE_XML
           (Information)
     VALUES
           (@Information);
END

--3. execute stored procedure to insert data, delta symbol gets recognized
  EXEC  SET_SAMPLEXML
    @Information = N' <tr>                      
        <td>Δcardia info</td>            
    </tr>';

 --4 Now, insert one more node with delta symbol. SqlServer converts it into ? mark.
    UPDATE SAMPLE_XML
    SET Information.modify('insert (<td>Δinput</td>) as first into (tr)[1]') WHERE
    ID=1;

 --5 The result of the select statement of the table. Please observe, newly inserted td tag has the delta symbol converted into ? mark. 
    <tr>
<td>?input</td>
<td>Δcardia info</td>
</tr>

person Sandhya    schedule 08.10.2013    source источник


Ответы (2)


Это не имеет ничего общего с XML. Ваш маленький треугольник является символом Unicode, и чтобы представить его без потери данных, вам нужно добавить к строке префикс N (который в любом случае должен быть у всех динамических SQL, даже если он не содержит известных символов Unicode).

Сравнивать:

SELECT [varchar] = 'Δ', [nvarchar] = N'Δ';

Полученные результаты:

varchar   nvarchar
-------   --------
?         Δ
person Aaron Bertrand    schedule 08.10.2013

Я нашел решение. Я изменил оператор xml.modify, чтобы использовать sql:variable, и создал хранимую процедуру для обновления содержимого, она работала нормально. Конечно, для динамического SQL данные должны иметь префикс «N».

СОЗДАТЬ ПРОЦЕДУРУ [dbo].[MODIFY_SAMPLEXML]

@Информация xml

КАК НАЧАТЬ

UPDATE SAMPLE_XML SET Information.modify('вставьте sql:variable("@Information") как первую в (tr)[1]') WHERE ID=1;

КОНЕЦ

person Sandhya    schedule 09.10.2013