2013-10-08 2 views
0

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

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

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

ответ

3

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

Сравнить:

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

Результаты:

varchar nvarchar 
------- -------- 
?   Δ 
0

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

CREATE PROCEDURE [DBO] [MODIFY_SAMPLEXML]

XML

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

AS НАЧАТЬ

UPDATE SAMPLE_XML SET Information.modify ('вставить SQL:. Переменная ("@ информация") как первый в (tr) [1] ') ГДЕ ID = 1;

END