【发布时间】:2017-07-29 15:11:18
【问题描述】:
我正在解析一个 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)')
但我不知道如何解决。
可以提出解决方案吗?
谢谢
【问题讨论】:
-
这是一个相关的答案:stackoverflow.com/a/41014697/5089204
标签: sql-server character-encoding xml-parsing utf-16