我在表格中有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>
答案 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