SQL Server添加? 在从XML转换时的单元格值之前和之后

我有一个C#应用程序需要一个Excel( .xlsx )文件,将其转换为XML,将其传递到SQL Server进行转换和validation。

这已经运行好几年了,但我现在有一个文件,其中几个单元格获得? 添加到值的开始和结束。 XML并不反映它们,但必须有一个隐藏的特殊字符。

这里是一个XML和T-SQL的副本来查看结果:

 DECLARE @x xml = '<Root> <Row> <ITEMNO>1</ITEMNO> <PARTSOURCE>BUY</PARTSOURCE> <QTY>1</QTY> <CUSTPARTNO>‭10-0306‬</CUSTPARTNO> <CREV>XYS</CREV> <DESCRIPT>CAP,CER,10PF,50V,NP0,RF,0402</DESCRIPT> <REFDESG>‭C96‬</REFDESG> <WORKCENTER /> <ASSYNUM>18-0074-01 REV J</ASSYNUM> <ASSYREV /> <ASSYDESC /> <CUSTNO>2519</CUSTNO> </Row> </Root>' SELECT DENSE_RANK() OVER(ORDER BY x.importBom.query('ITEMNO/text()').value('.','VARCHAR(MAX)')+ x.importBom.query('DESCRIPT/text()').value('.', 'VARCHAR(MAX)'))rowNum, x.importBom.query('ITEMNO/text()').value('.','VARCHAR(MAX)') itemno, UPPER(x.importBom.query('PARTSOURCE/text()').value('.', 'VARCHAR(MAX)')) partSource, x.importBom.query('QTY/text()').value('.', 'VARCHAR(MAX)') qty, x.importBom.query('CUSTPARTNO/text()').value('.', 'VARCHAR(MAX)') custPartNo, x.importBom.query('CREV/text()').value('.', 'VARCHAR(MAX)')crev, x.importBom.query('DESCRIPT/text()').value('.', 'VARCHAR(MAX)')descript, UPPER(x.importBom.query('WORKCENTER/text()').value('.', 'VARCHAR(MAX)'))workCenter, x.importBom.query('REFDESG/text()').value('.', 'VARCHAR(MAX)')refDesg, x.importBom.query('CUSTNO/text()').value('.', 'VARCHAR(MAX)')custno, x.importBom.query('ASSYNUM/text()').value('.', 'VARCHAR(MAX)')assynum, x.importBom.query('ASSYREV/text()').value('.', 'VARCHAR(MAX)')assyrev, x.importBom.query('ASSYDESC/text()').value('.', 'VARCHAR(MAX)')assydesc FROM @x.nodes('/Root/Row') AS X(importBom) OPTION (OPTIMIZE FOR(@x = NULL)) 

CUSTPARTNOREFDESG字段都得到? 在SQL Server表中,但没有其他列有它。 这是CUSTPARTNO值的服务器的一个例子: ?10-0306?

在创buildXML时,我会执行以下操作来删除一些特殊字符和最后不需要的空格:

 cellValue = cellValue.Replace("\r", "") //carriage return .Replace("\n", " ")//new line .Replace("\t", "")//tab .Trim(); 

这不会影响结果。

我怎样才能“看到”隐藏的特殊字符?

而且,从单元中删除它们的最好方法是什么,以便它们不会添加到SQL Server表中?

不知道这是不是一个公开的问题,但我很好奇…

如果你用光标慢慢地穿过,你会发现在给定的位置光标不能向前移动…这就是hex编辑器显示的内容

在这里输入图像说明

在这两种情况下,您的值由Unicode字符2D20和2C20框起来。 2D20是“格鲁吉亚小信hae”,2C20是“glagolitic大写字母yeri”。 也许这有助于你理解这是从哪里来的。

根据Panagiotis Kanavos,如果将XML的声明更改为

 DECLARE @x xml = N'<Root> ... 

然后在您的.value()调用中使用NVARCHAR

顺便说一句:你的查询使用.query()然后.value()可以缩短这样做。

 SELECT DENSE_RANK() OVER(ORDER BY x.importBom.value('ITEMNO[1]','NVARCHAR(MAX)') + x.importBom.value('DESCRIPT[1]', 'NVARCHAR(MAX)'))rowNum, x.importBom.value('ITEMNO[1]','NVARCHAR(MAX)') itemno, UPPER(x.importBom.value('PARTSOURCE[1]', 'NVARCHAR(MAX)')) partSource, x.importBom.value('QTY[1]', 'NVARCHAR(MAX)') qty, x.importBom.value('CUSTPARTNO[1]', 'NVARCHAR(MAX)') custPartNo, x.importBom.value('CREV[1]', 'NVARCHAR(MAX)')crev, x.importBom.value('DESCRIPT[1]', 'NVARCHAR(MAX)')descript, UPPER(x.importBom.value('WORKCENTER[1]', 'NVARCHAR(MAX)'))workCenter, x.importBom.value('REFDESG[1]', 'NVARCHAR(MAX)')refDesg, x.importBom.value('CUSTNO[1]', 'NVARCHAR(MAX)')custno, x.importBom.value('ASSYNUM[1]', 'NVARCHAR(MAX)')assynum, x.importBom.value('ASSYREV[1]', 'NVARCHAR(MAX)')assyrev, x.importBom.value('ASSYDESC[1]', 'NVARCHAR(MAX)')assydesc FROM @x.nodes('/Root/Row') AS X(importBom) OPTION (OPTIMIZE FOR(@x = NULL))