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

时间:2015-09-21 21:12:20

标签: xml excel sql-server-2014

我有一个C#应用程序,它接受一个Excel(.xlsx)文件,将其转换为XML,并将其传递给SQL Server进行转换和验证。

多年来这种方法运行良好,但我现在有一个文件,其中有几个单元格被?添加到值的开头和结尾。 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?

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

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

这不会影响结果。

我怎样才能看到&#34;&#34;隐藏的特殊人物?

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

1 个答案:

答案 0 :(得分:1)

不知道这仍然是一个悬而未决的问题,但我很好奇......

如果您慢慢单步使用光标,您会看到在给定位置光标不会向前移动......这就是HEX编辑器显示的内容

enter image description here

在这两种情况下,您的值都由unicode字符2D20和2C20构成。 2D20是“georgian small letter hae”,2C20是“glagolitic capital letter yeri”。也许这可以帮助您了解它的来源。

根据Panagiotis Kanavos的说法,如果你将XML的声明改为

,它就有效
DECLARE @x xml = N'<Root> ...

然后在NVARCHAR来电

中使用.value()

btw:使用.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))