当前位置: 首页 > 知识库问答 >
问题:

SQL Server 2014-用西里尔字符解析XML

寿子轩
2023-03-14

我正在解析一个xml文件,但西里尔字符有问题:

这是存储过程的相关部分

要解析的SOAP输入:

'<?xml version="1.0"?>
<soapenv:Envelope xmlns:.......>
    <soapenv:Header>
    </soapenv:Header>
    <soapenv:Body>
        <GetResponse>
            <BuyerInfo>
              <Name>Polydoros Stoltidys</Name>
              <Street>Луговой проезд дом 4 корпус 1 квартира 12</Street>
            </BuyerInfo>
        </GetResponse>
    </soapenv:Body>
</soapenv:Envelope>'

存储过程

 CREATE PROCEDURE dbo.spXML_ParseSOAP
(
    @XML    XML
)
AS
SET NOCOUNT ON;
DECLARE @S nvarchar(max)='',
        @C  nvarchar(max)='',
        @D  nvarchar(max)=''


    SELECT 
        @C= IIF (CHARINDEX('['+T.X.value('local-name(.)', 'nvarchar(100)')+']',@C)=0, CONCAT( ISNULL(@C + ',','') , QUOTENAME(T.X.value('local-name(.)', 'nvarchar(100)'))), @C),
        @D= IIF (CHARINDEX('['+T.X.value('local-name(.)', 'nvarchar(100)')+']',@CP)=0, CONCAT( ISNULL(@D + ',N','') , '''',  T.X.value(N'text()[1]', 'nvarchar(max)'),''''), @D),
    FROM @XML.nodes('//*[count(child::*) = 0]') AS T(X)
    WHERE  T.X.value(N'local-name(.)', 'nvarchar(500)') 
    IN (select name from Customers.sys.columns where [object_id]=@O and is_identity=0)

    SET @S=N'INSERT INTO Sales.dbo.ShippingAddress ('+@C+',ShippingAddressID) VALUES ('+@D+','''+@FADR+''') 

    Print @S

问题是@s看起来是这样的

INSERT INTO Sales.dbo.ShippingAddress ([Name],[Street1],ShippingAddressID) 
VALUES 
(N'Polydoros Sample',N'??????? ?????? ??? 4 ?????? 1 ???????? 12','KkQ0LhbhwXfzi+Ko1Ai6s+SDZRT2kYhYC3vM2x2TB5Y=') 

我把N放在所有输入的前面,但问题显然在前面:我可以假设是在

    T.X.value(N'text()[1]', 'nvarchar(max)')

但我不知道如何解决它。

可以提出解决方案吗?

谢谢

共有1个答案

张嘉佑
2023-03-14

您的声明@xml行错误。字符串文本需要以大写n作为前缀。字符被转换成?在字面上的解释中。

此外,您没有给所有字符串文本加上大写-n前缀,但至少有一个前缀(集合@s=n'行中的第一个,因此其余的文本(没有n前缀的varchar)将隐式转换为nvarchar

以下对已更新代码的修改显示了这种行为,以及在输入字符串上放置n前缀(在调用存储过程之前)如何解决该问题:

DECLARE @XML XML = N' <!-- remove the N from the left to get all ???? for "Street"-->
            <BuyerInfo>
              <Name>Polydoros Stoltidys</Name>
              <Street>Луговой проезд дом 4 корпус 1 квартира 12</Street>
            </BuyerInfo>
';


DECLARE @S nvarchar(max)='',
        @C  nvarchar(max)='Street',
        @D  nvarchar(max)=''


    SELECT 
        @D= IIF (T.X.value('local-name(.)', 'nvarchar(100)') = N'Street',
                 T.X.value('./text()[1]', 'nvarchar(100)'),
                 @C)
    FROM @XML.nodes('//*[count(child::*) = 0]') AS T(X)

    SET @S=N'INSERT INTO Sales.dbo.ShippingAddress ('
           +  @C+',ShippingAddressID) VALUES (N'''+@D+''',''a'') '

    Print @S;

此外,SQL Server XML从来不会存储 声明行,因此最好将其从文字值的开头删除。

 类似资料:
  • 问题内容: 我正在尝试使用php的函数json_encode将西里尔UTF-8数组编码为JSON字符串。示例代码如下所示: 它工作正常,但脚本的结果表示为: 每个西里尔字母组成6个字符。有没有一种方法可以获取键/值对的原始字符,而不是编码的字符? 问题答案: 您不能在此处使用JSON_UNESCAPED_UNICODE常量吗?

  • 问题内容: 当用户在数据库中插入俄语单词如“锌褉松弛屑械Russian”时,数据库将其保存为“ ??????”。如果他们以’N’字母插入,或者我以’N’字母进行选择,即;exec Table_Name N’没有问题。但是我不想在每个查询中都使用“ N”,因此对此有什么解决方案吗?顺便说一下,我将使用存储过程。 更新: 现在,我可以使用带有排序规则的俄语字母。但是我无法更改每种语言的排序规则,我只想

  • 我正在使用pdfbox 2.0.5使用以下代码填写PDF文档的表单字段: 我得到这个错误:U+0434('AFII10069')在此字体Times-Roman(泛型:TimesNewRomanPSMT)编码:StandardEncoding with Difference中不可用 我必须在文本字段中指定哪种字体来处理西里尔(或亚洲)字符? 谢谢,罗波

  • 我有PDF模板文件与字段。客户创建的模板。它有一些文本、字段标签和字段本身。文本和标签使用嵌入在模板中的某种字体。 当我尝试用西里尔文值填充字段时会出现问题-结果文档中没有西里尔文符号。 所以问题是:1。如果我可以嵌入字体在Adobe Acrobat只用于字段,那么如何做?2.如果我可以用iTextSharp为现有字段定义字体族,那么该怎么做?

  • 如何使其在输出俄语时,输出俄语字母,而不是�� ����� �������� �����! 它不仅在控制台中工作,而且在终端中一切正常 我试过这个 > 窗口 还有这个 窗户- 还有这个 在eclipse主目录中打开eclipse.ini,或者在STS(Spring Tool Suite)的情况下打开STS. ini,将下面的行放在文件末尾-Dfile.encoding=UTF-8 但还是做不到。请

  • Adobe Reader无法正确显示我的PDF。对于其他PDF阅读器来说,这是一个语法问题,因为我听说Adobe Reader对PDF语法要求更严格。字体似乎是它们应该的两倍大,但水平间距是正确的,这使得字体相互重叠。 这是我的C#代码(字体创建代码在本文末尾)。