SqlServer的XML DML语句将Delta符号转换为问号

时间:2013-10-08 21:00:21

标签: sql-server xml dml

我在表格中有xml列。当我将xml插入表中时,xml中的所有符号都是正常的。但是当我尝试使用Xml DML语句将节点插入xml时,如果该节点具有“Delta”等符号,则SqlServer将它们转换为问号。任何人都可以建议如何解决这个问题?

以下是示例代码:

- 1.创建表
     CREATE TABLE SAMPLE_XML(ID INT IDENTITY,Information 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>

2 个答案:

答案 0 :(得分:3)

这与XML无关。你的小三角形是一个Unicode字符,为了表明它不会丢失数据,你需要在字符串前加上一个N(所有动态SQL都应该是这样,即使它不包含已知的Unicode字符)。

比较

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

结果:

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

答案 1 :(得分:0)

我找到了解决方案。我更改了xml.modify语句以使用sql:variable并创建了一个用于更新内容的存储过程,它运行正常。当然,对于动态SQL,数据应该以'N'为前缀。

CREATE PROCEDURE [dbo]。[MODIFY_SAMPLEXML]

@Information xml

AS BEGIN

更新SAMPLE_XML    SET Information.modify('insert sql:variable(“@ Information”)作为第一个进入(tr)[1]')    WHERE ID = 1;

END