我有一个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))
CUSTPARTNO
和REFDESG
字段都获得SQL Server表中的?
,但没有其他列拥有它。这是来自CUSTPARTNO值的服务器的示例:?10-0306?
创建XML时,我会执行以下操作以删除最后的一些特殊字符和不需要的空格:
cellValue = cellValue.Replace("\r", "") //carriage return
.Replace("\n", " ")//new line
.Replace("\t", "")//tab
.Trim();
这不会影响结果。
我怎样才能看到&#34;&#34;隐藏的特殊人物?
并且,从单元格中删除它们的最佳方法是什么,以便它们不会添加到SQL Server表中?
答案 0 :(得分:1)
不知道这仍然是一个悬而未决的问题,但我很好奇......
如果您慢慢单步使用光标,您会看到在给定位置光标不会向前移动......这就是HEX编辑器显示的内容
在这两种情况下,您的值都由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))