【发布时间】:2015-04-06 13:38:39
【问题描述】:
我有一个VARCHAR(MAX) 字段,它以XML 格式连接到外部系统。接口抛出以下错误:
mywebsite.com-2015-0202.xml:413005: parser error : xmlParseCharRef: invalid xmlChar value 29
ne and Luke's family in Santa Fe. You know you have a standing invitation,
^
mywebsite.com-2015-0202.xml:455971: parser error : xmlParseCharRef: invalid xmlChar value 25
The apprentice nodded, because frankly, who hadnt? That diseases like chol
^
mywebsite.com.com-2015-0202.xml:456077: parser error : xmlParseCharRef: invalid xmlChar value 28
bon mot; a sentimental love of nature and animals; the proverbial British 
^
mywebsite.com-2015-0202.xml:472073: parser error : xmlParseCharRef: invalid xmlChar value 20
"Andyou want that?"
^
mywebsite.com-2015-0202.xml:492912: parser error : xmlParseCharRef: invalid xmlChar value 25
She couldnt live like this anymore.
我们发现以下字符列表无效:
�








	
























我正在尝试清理这些数据,我找到了一个 SQL 函数来清理这些字符here。但是,该函数将NVARCHAR(4000) 作为输入参数,因此我已将函数更改为使用VARCHAR(MAX)。
如果将NVARCHAR(4000) 更改为VARCHAR(MAX) 会产生错误的结果,谁能告诉我?抱歉,我无法在本地测试此界面,因此想征求意见/建议。
原始功能:
CREATE FUNCTION fnStripLowAscii (@InputString nvarchar(4000))
RETURNS nvarchar(4000)
AS
BEGIN
IF @InputString IS NOT NULL
BEGIN
DECLARE @Counter int, @TestString nvarchar(40)
SET @TestString = '%[' + NCHAR(0) + NCHAR(1) + NCHAR(2) + NCHAR(3) + NCHAR(4) + NCHAR(5) + NCHAR(6) + NCHAR(7) + NCHAR(8) + NCHAR(11) + NCHAR(12) + NCHAR(14) + NCHAR(15) + NCHAR(16) + NCHAR(17) + NCHAR(18) + NCHAR(19) + NCHAR(20) + NCHAR(21) + NCHAR(22) + NCHAR(23) + NCHAR(24) + NCHAR(25) + NCHAR(26) + NCHAR(27) + NCHAR(28) + NCHAR(29) + NCHAR(30) + NCHAR(31) + ']%'
SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)
WHILE @Counter <> 0
BEGIN
SELECT @InputString = STUFF(@InputString, @Counter, 1, NCHAR(164))
SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)
END
END
RETURN(@InputString)
END
修改版:
CREATE FUNCTION [dbo].RemoveInvalidXMLCharacters (@InputString VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
IF @InputString IS NOT NULL
BEGIN
DECLARE @Counter INT, @TestString NVARCHAR(40)
SET @TestString = '%[' + NCHAR(0) + NCHAR(1) + NCHAR(2) + NCHAR(3) + NCHAR(4) + NCHAR(5) + NCHAR(6) + NCHAR(7) + NCHAR(8) + NCHAR(11) + NCHAR(12) + NCHAR(14) + NCHAR(15) + NCHAR(16) + NCHAR(17) + NCHAR(18) + NCHAR(19) + NCHAR(20) + NCHAR(21) + NCHAR(22) + NCHAR(23) + NCHAR(24) + NCHAR(25) + NCHAR(26) + NCHAR(27) + NCHAR(28) + NCHAR(29) + NCHAR(30) + NCHAR(31) + ']%'
SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)
WHILE @Counter <> 0
BEGIN
SELECT @InputString = STUFF(@InputString, @Counter, 1, ' ')
SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)
END
END
RETURN(@InputString)
END
【问题讨论】:
-
听起来问题出在将字符串放入 XML 的地方-如果您使用的是不错的 XML 工具,它应该会自动执行所需的转义(或将文本包装在 @ 987654332@
]]>块)。您不必重新实现此类功能。 -
@Damien_The_Unbeliever 不幸的是,这些“有问题的”XML 工具之一就是 SQL 本身。如果您在 SQL 查询中使用“FOR XML”将 NVARCHAR 数据转换为 XML,SQL 将很乐意将无效的 XML 字符作为其“预期”转义序列; SQL Server 生成 SQL Server 无法解析的 XML:\
-
我正面临这个问题......仍然没有找到任何解决方案。就我而言,问题甚至更糟,因为我现在不能在手边可能包含无效字符的列。 :(
-
@VictorEspina,找到了一个可能对您有所帮助的解决方案,如果这仍然是一个悬而未决的问题。请在下面阅读我的回答。
-
@Damien_The_Unbeliever,我找到了解决此问题的方法,您可能会感兴趣...
标签: sql sql-server xml tsql sql-server-2012