【发布时间】:2016-03-21 17:45:06
【问题描述】:
我们有以下场景:过程是在输出上使用 Oracle 存储过程返回带有希腊字母的字符串。
Oracle 函数(示例)是:
FUNCTION GREEKLATINSTRING (a_latin_name IN VARCHAR2) RETURN VARCHAR2
IS
BEGIN RETURN 'ΣΤΡΟΒΟΛΟΣ/123/ABC'; END;
这个函数是从一个 T-SQL 存储过程中调用的(请假设所有连接都是 100%,因为我们有其他过程正在执行而没有问题)
TSQL 存储过程是:
CREATE PROCEDURE [dbo].[GreekLatinString] @NameLatin NVARCHAR(100)
AS
DECLARE @output NVARCHAR(100);
DECLARE @SQL NVARCHAR(MAX);
BEGIN
SET @SQL = N'BEGIN ? := LINKED_SERVER.DB_INSTANCE.GREEKLATINSTRING(?); END;';
EXECUTE(@SQL,
@output OUTPUT ,
@NameGr ) --1Params
AT MYORACLE;
SELECT cast (@output as nvarchar)
END
而 C# 代码并没有什么特别之处 - 只是取回数据:
dbCommand = CreateCommand();
dbCommand.Transaction = ModelContext.CurrentDBUtils.Transaction;
dbCommand.CommandText = "GreekLatinString";
dbCommand.CommandType = CommandType.StoredProcedure;
SqlParameter param0 = new SqlParameter("NameLatin", nameLatin);
param0.Direction = ParameterDirection.Input;
dbCommand.Parameters.Add(param0);
using (SqlDataAdapter adapter = new SqlDataAdapter(dbCommand as SqlCommand))
{
adapter.Fill(dataset);
}
SQL Server 实例排序规则是 SQL_Latin1_General_CP1253_CI_AS AND Oracle NLS_LANG 是 al32utf8
问题是,每当函数直接在 Oracle 中执行时,它都会返回应有的值,但是每当我们从 SQL Server 存储过程内部从 C# 调用时,数据集中的输出始终是 ????????
任何人都可以提出可能的原因吗?
【问题讨论】:
-
尝试 BEGIN RETURN N'ΣΤΡΟΒΟΛΟΣ';
-
从代码来看,
greek_to_latin看起来像是在返回希腊字母,所以我不清楚为什么叫它greek_to_latin。我没有听说过al8utf8,并且在Oracle 的全球化指南中找不到它的参考资料。 docs.oracle.com/database/121/NLSPG/index.htm#A -
如果我明白的话。您可以在 Oracle 框中调用
greek_to_latin并获得正确的结果。从 C# 调用GreekToLatin会得到????...。GreekToLatin从 SSMS 直接在 SQL Server 中怎么样? -
如果您检查它的字节值,您会看到什么?您的应用是否能够显示来自其他来源的希腊字母(即硬编码)
-
@Frisbee 我已经更改了一些解释,请再看一遍 + 我提供了返回值作为示例。通常我们从 oracle 返回 varchar2 输出变量。有没有办法强制 N' ' 像 var 而不是一些 const 字符串的行为?
标签: c# sql-server oracle tsql stored-procedures