【问题标题】:Error converting sp_OAMethod output to xml将 sp_OAMethod 输出转换为 xml 时出错
【发布时间】:2015-10-08 00:54:21
【问题描述】:

以下两个 SQL 语句大部分时间都可以正常工作。最近我在特定情况下遇到错误:

消息 9420,级别 16,状态 1,过程 Alcom_Get_Customer_Details,第 96 行 XML解析:第1行,字符399,非法xml字符

产生错误的语句是

Exec @ErrCode=sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

SELECT @XmlResponse as XmlResponse

select @XmlResponse = CAST(@ResponseText as xml)

当我检查 'SELECT @XmlResponse as XmlResponse's 语句的输出时,它只有 361 个字符。从 362 开始似乎有多余的字符。

请问我该如何解决这个错误?

谢谢。

【问题讨论】:

  • 可以查看@ResponseText的内容吗?它实际上是否包含非法 XML 字符?
  • 我检查了@ResponseText 的内容。不,它不包含任何非法字符。我在 VS 编辑器中将响应作为二进制文件打开。没有超过 362 列。
  • @ResponseText 是:schemas.xmlsoap.org/soap/envelope" xmlns:xsi="@987654322 @" xmlns:xsd="w3.org/2001/XMLSchema"> alarm.com/WebServices"> 3797167
  • 将输出保存为二进制文件并在 FireFox 中打开后发现非法字符!是的 @ResponseText 包含非法字符。请问如何在 T-Sql 中只保留合法的 xml 字符?
  • SELECT ASCII('�'), ASCII('�') 并且这两个字符的结果都是 63。我确实在 SSMS 编辑器中正确地看到了它们。

标签: xml tsql


【解决方案1】:

我的同事给了我一个简单的答案,它只允许字符代码 32 到 127。所有其他字符都被删除:

CREATE FUNCTION dbo.RemoveNonASCII 
(
       @nstring nvarchar(4000)
)
RETURNS varchar(4000)
AS
BEGIN
       DECLARE @Result varchar(4000)
       SET @Result = ''

       DECLARE @nchar nvarchar(1)
       DECLARE @position int

       SET @position = 1
       WHILE @position <= LEN(@nstring)
       BEGIN
              SET @nchar = SUBSTRING(@nstring, @position, 1)

              IF UNICODE(@nchar) between 32 and 127
                     SET @Result = @Result + @nchar
              SET @position = @position + 1
       END

       RETURN @Result
END

感谢发现UNICODE函数的同事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2020-10-22
    • 2020-02-27
    • 2013-05-23
    • 2015-02-06
    • 1970-01-01
    相关资源
    最近更新 更多