如何将nvarchar(非英语)传递给CLR(C#)存储过程?

时间:2016-04-28 13:06:25

标签: .net stored-procedures sqlclr sqlxml non-english

在Visual Studio中工作,我试图使用FOR XML RAW和C#代码中的SqlXml类型的参数将整行传递给CLR存储过程(目的是使用XmlReader处理行)。该行包含nvarchar字段。

当nvarchar字段包含英文/数字/简单标点符号文本时,一切正常,但当其中任何一个包含希伯来语或俄语字符时,这些字符将变为问号。 (对于仅限俄语的文本也是如此,因此不是RTL问题)

从SQL代码中的打印件中我发现XML RAW创建的xml保留了非英文字符 - 它们打印得很好。但是当打印sqlXmlParameter.Value(或将其放在输出字符串中并在sql中打印)时会打印问号而不是非英文字符。 我尝试过使用SqlString参数并获得相同的结果 - 该参数在SQL中看起来很好,但在传递给CLR过程时会发生变化。

我还发现T-SQL和C#都使用UTF-16作为默认编码,所以这真的很奇怪。

如何在将参数传递给CLR或将编码信息附加到CLR时保留非英文字符?

编辑:此问题涉及以下内容:How to make SqlContext.Pipe.Send in SQLCLR stored proc work with unicode? 事实证明,另一个问题的解决方案也解决了这个问题。我不知道为什么,因为在这种情况下C#代码不包含非英文字符,但它确实使用字符串格式化的字符串可能是非英语的,所以可能由于常量如何导致一些混合编码字符串格式已保存。只是我的猜测。 因此,如果有人遇到相关问题(尽管我对其进行了模糊定义),您可能想尝试一下。

1 个答案:

答案 0 :(得分:0)

没有提供示例代码(C#甚至T-SQL来调用存储过程)因此很难确定,但您可能在调用存储过程时犯了一个错误。很可能你不是在Unicode和XML文字前加N作为Unicode来保留它们。以下C#代码和T-SQL显示SQLCLR正确接受并显示所有三种数据类型的Unicode字符:SqlStringSqlCharsSqlXml(样本中的希伯来语和俄语文本样本)相关问题):

<强> C#

using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public class UnicodeTesting
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void PrintTest(SqlString StringParam, SqlChars CharsParam,
                                 SqlXml XmlParam)
    {
        SqlContext.Pipe.Send("Unicode test: blip");
        SqlContext.Pipe.Send("Unicode test: בליפ");
        SqlContext.Pipe.Send("Unicode test: Блип");

        SqlContext.Pipe.Send("StringParam: " + StringParam.Value);
        SqlContext.Pipe.Send("CharsParam: " + new String(CharsParam.Value));
        SqlContext.Pipe.Send("XmlParam: " + XmlParam.Value);
    }
}

<强> T-SQL

EXEC dbo.PrintTest N'בליפ a',
                   N'בליפ b',
                   N'<test>בליפ c</test><test>Блип</test>';

输出(在“消息”标签中)

Unicode test: blip
Unicode test: בליפ
Unicode test: Блип
StringParam: בליפ a
CharsParam: בליפ b
XmlParam: <test>בליפ c</test><test>Блип</test>