【发布时间】:2016-08-23 06:34:09
【问题描述】:
在 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 时保留非英文字符,或将编码信息附加到它们?
编辑:此问题涉及以下内容:How to make SqlContext.Pipe.Send in SQLCLR stored proc work with unicode? 事实证明,另一个问题的解决方案也解决了这个问题。我不知道为什么,因为这种情况下的 C# 代码不包含非英文字符,但它确实使用了可能是非英文字符串的字符串格式,所以可能是由于常量在字符串格式已保存。不过只是我的猜测。 因此,如果有人遇到相关问题(尽管我对它的定义模糊),您可能想尝试一下。
【问题讨论】:
-
如何将 XML 从 RDBMS 传输到应用程序?
-
@Shnugo 我将 C# 代码添加为存储过程,并从 SQL 调用存储过程。据我所知,VS 将 C# 代码转换为程序集并自动创建将该程序集称为 EXTERNAL 的存储过程。
-
是的,默认情况下,Windows / .NET / SQL Server (
NVARCHAR/NCHAR/XML) 中的字符串是 UTF-16 Little Endian。从 XML 从 SQL Server 传输到 SQLCLR 对象(无论是传输到SqlXml还是SqlString/SqlChars)时,字符不应发生变化。你试过SqlChars,它给你一个char[]吗?您可以从中创建一个新字符串:string _Test = new string(SqlCharsParam.Value);. -
你可能会发布一些代码?我见过与字符串操作人员相关的奇怪隐式转换(例如,添加根节点或顶级处理指令 (
<? somthing ?>) 或组合 XML 部分时...... -
另外,Windows 的 LCID 和包含 SQLCLR 代码的数据库的 LCID 是什么?运行以下命令:
SELECT os_language_version, DATABASEPROPERTYEX(N'{name of DB where Assembly exists}', 'LCID') AS 'DatabaseLCID' FROM sys.dm_os_windows_info;
标签: .net stored-procedures sqlclr sqlxml non-english