mssql2000 sp4中select in要用什么索引来优化?怎样排序?

当前位置 &
Microsoft SQL Server 2000 的国际化功能(3)
Unicode 服务器和客户端
这是理想的配置类型。通过在整个过程中以 Unicode 形式保存数据,您可以确保最佳的性能并防止检索到的数据被毁坏。ADO 和 OLE DB 就属于这种情况。www.chinaitp ower
.comc3iWkZh
Unicode 服务器和一个或多个非 Unicode 客户端
在这种配置中,您可能不会遇到数据存储方面的问题,但是在将数据传送到客户端并使用这些数据时,明显会有很大的限制。客户端代码页必须用于在某一时刻转换 Unicode 数据。www.chinaitp ower
.comc3iWkZh
在数据层上的示例就是您从正在使用 DB-Library 的计算机连接到 SQL Server 2000 数据库的时刻。DB-Library 是允许 C 应用程序访问 SQL Server 的调用级别接口。自 SQL Server 6.5 以来,DB-Library 尚未进行重要的升级。对于我们来说,这将明显地说明任何使用 DB-Library 的客户端所面临的限制。数据可以仅基于一个代码页,即系统的默认 OEM 代码页。您还可以选择区域设置信息是否基于客户端系统的区域设置。如以下图解(图 10)所示,在 SQL Server 客户端网络实用程序的&DB-Library 选项&选项卡中,您可以在两个选项之间选择 DB-Library 转换信息的方式。在默认情况下,这两个选项都会被选中。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 10:默认的 DB-Library 选项www.chinaitp ower
.comc3iWkZh
由于无法处理其他代码页上的数据,所以只有当数据层处于只需要处理 SQL Server 中数据子集的遗留系统中时,DB-Library 才真正具有意义。虽然确实有了解决的技术,已经使用它的开发人员不需要重写其应用程序,但是如果需要支持多种语言数据,重写仍可能是值得考虑的。www.chinaitp ower
.comc3iWkZh
非 Unicode 客户端的另一示例是不支持 Unicode 的程序,如 Microsoft Access 97。当 Access 数据库可以连接到 SQL Server 2000 数据库时,存在一些您应该知道的限制。例如,当您从美国英语的计算机连接到具有日语表名的数据库时,就可能会看到一个表名已转换为问号的对话框。以下图解(图 11)显示了这种对话框的示例。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 11:Access 97 中表名转换为问号的图解www.chinaitp ower
.comc3iWkZh
此问题的原因是很容易理解的:Access 97 使用的是版本低于 3.7 的 ODBC,所以数据使用默认系统代码页从 Unicode 转换为 ANSI。即使您安装了 ODBC 的更高版本,Access 97 中的 Jet 3.5 仍将执行相同的转换。由于日语字符不在美国英语计算机的代码页 1252 上,所以将它们替换为问号。www.chinaitp ower
.comc3iWkZh
不可能与这些表建立连接。连接尝试将导致图 12 中所示的错误消息。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 12:Microsoft Access 错误消息www.chinaitp ower
.comc3iWkZh
这也很容易理解。数据一旦转换为错误的代码页并由问号替换,将没有办法使其恢复。这将使 Jet 和 ODBC 直接尝试连接到名为 dbo.???? 的表。因为该表不存在,此尝试显然会失败。对于不在该代码页中的所有数据,也会出现这种情况。www.chinaitp ower
.comc3iWkZh
类似的问题也将在表本身的数据中出现。例如,在一个包含朝鲜语数据的表中,您将看到非 Unicode 客户端(如 Access)提供的数据显示为问号。图 13 中对此进行了说明。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 13:非 Unicode 客户端数据库中问号的示例www.chinaitp ower
.comc3iWkZh
在下面所有三种客户端(即 DB-Library、ODBC 和 Jet 3.5)中,只理解如何将 Unicode 转换为默认的系统代码页,而不理解 Unicode 的组件将不能处理这种多种语言数据。这种客户端只能使用其默认系统代码页上可包含的数据。www.chinaitp ower
.comc3iWkZh
非 Unicode 服务器和 Unicode 客户端
对于多种语言数据而言,这不是理想的配置,因为您将无法在服务器上保存这种数据。但是,您至少可以确保数据会正确显示。该配置具有前面情况中提到的所有限制,但不会因转换无效而毁坏已接收的数据。示例之一就是 SQL Server 2000 数据库将链接的服务器定义为 SQL Server 6.5 数据库。从运行 SQL Server 6.5 的服务器接收的所有信息都将是有效的,但不要尝试插入不在代码页上的数据。www.chinaitp ower
.comc3iWkZh
非 Unicode 服务器和客户端
这是限制最多的配置,因为无论什么时候,您基本上只能使用一个代码页。www.chinaitp ower
.comc3iWkZh
从 SQL Server 早期版本进行的多种语言数据转换
并非所有用户都有耐心等待使用 SQL Server 7.0 和 SQL Server 2000 中包含的 Unicode 功能来处理他们的多种语言数据。因此,有些用户已创建了自定义编码架构来存储这种数据。如果您考虑使用这种方法,那么您将需要使用大容量复制实用程序 (bcp) 将数据保存为二进制形式(意味着无数据转换),然后使用 -C 命令行参数将数据大批量复制到相应的代码页。有关 bcp 实用程序的详细信息,请参见本文稍后的使用 bcp 实用程序来处理多种语言数据。www.chinaitp ower
.comc3iWkZh
使用 Access 2000 的新 ADP 格式
Microsoft Access 2000 增添了一个新文件格式选项,它不是 Jet 数据库,而是 Access 数据项目 (ADP)。这些文件可以直接作为 SQL Server 的前端。www.chinaitp ower
.comc3iWkZh
ADP 功能超出了本文讨论的范围,但要指出的两个重要问题是: www.chinaitp ower
.comc3iWkZh
Access 2000 不支持 SQL Server 2000,除非安装了 SQL Server 2000 客户端工具。
在 Access 内 SQL Server 数据的所有入口点(窗体、数据访问页、表数据表视图和 ADO)中,Access 和 SQL Server 之间存在一个中间层,即 COM。它会影响日期/时间值、数字和货币值的输入,因为客户端(在这种情况下指 ADP 所在的计算机)的区域设置用于解释数据的含义。当您使用 Access 时,务必要记住这一点,因为 SQL Server 的规则在某些情况下限制并不多。有关详细信息,请参见本文稍后的处理 COM 的区域设置冲突。
用户界面中的多种语言数据
尽管 SQL Server 主要是服务器,但它仍带有多种管理工具。这些工具已根据需要在 Server 2000 中进行了更新,以支持多种语言数据。www.chinaitp ower
.comc3iWkZh
一般的 UI 更改(Unicode 支持)
在处理当前默认代码页或服务器代码页上的表名时,SQL Server 企业管理器表现相当出色。在需要时,它还可以利用 Windows 中的一些字体链接技术来&借用&其他字体的字符,如以下图解(图 14)中所示。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
14: 字体链接技术示例www.chinaitp ower
.comc3iWkZh
如上所示,字体链接无法完成全部工作。对于许多种语言(如亚美尼亚语、Sylfaen、格鲁吉亚和印地语),Windows 没有高级字体链接信息。另外,当某种语言使用在脚本中不常用的字符(如阿泽里语 - 斯拉夫语)时,除了少数字符可能不会显示外,字符串的大多数字符都将显示。www.chinaitp ower
.comc3iWkZh
有三件有趣的事值得注意: www.chinaitp ower
.comc3iWkZh
只要名称在字体中不受支持且字体链接无法实现,您将看不到毁坏的字符;相反,您将看到如上所示的对话框,它表示有无法显示的字符。
SQL Server 2000 客户端工具没有使用 Uniscribe 技术来呈现复杂的脚本,所以如果您使用的不是 Windows 2000,双向语言(如前面图解所示的希伯来语、意第绪语、阿拉伯语和波斯语)字符向后显示。但是,在 Windows 2000 和支持 BIDI 的平台上,这些字符将正确显示。其他复杂脚本的呈现问题(如泰语的断字)则会遇到同样的限制(即使不在 Windows 2000 上)。
SQL Server 企业管理器所用的&基本&字体是在计算机桌面显示设置中定义的,它不能被覆盖。
SQL 查询分析器的网格和 SQL 窗格中的多种语言信息
在 SQL Server 企业管理器中,不能对字体进行更改;但是,在 SQL 查询分析器中,您可以在&选项&对话框中的&字体&选项卡中显式地更改用户界面多个部分的字体。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 15:&SQL Server 2000 查询分析器字体&对话框www.chinaitp ower
.comc3iWkZh
由于字体链接似乎允许显示大多数字符串,所以进行这种更改的原因起初可能并不明显。但是,正确显示字符串要比简单地找到可表示字符的字体要费事得多。通常,字体选择是很重要的。因此,这种功能对于正确显示多种语言数据也相当重要。在字体链接看来无法工作的情况下,该功能将使您看到字符串,而不是对话框。www.chinaitp ower
.comc3iWkZh
查询设计器中的格式问题
在查询设计器的许多部分中,您可以在网格窗格中输入与计算机的默认区域设置匹配的信息,或者可以显式地使用 CONVERT 函数来处理采用任意格式的字符串。www.chinaitp ower
.comc3iWkZh
在采用这种区域设置使用方法时,您应该明确以下一些的设计限制: www.chinaitp ower
.comc3iWkZh
不支持长数据格式。
虽然可以选择使用美元符号 ($),但不应在网格窗格中输入货币符号。无论怎样,从区域设置中检索到的货币符号都将在&结果&窗格中使用。
无论区域设置是什么,一元减号始终显示在左侧,且不带括号。因此,-1 应该显示为 -1,而不是 1- 、(1),也不是可能在&区域选项&对话框中指定的任何有效变量。
要在查询设计器中实现一定程度的全球性支持,这些限制是必需的,它们不会妨碍大多数使用特定于区域设置的数据的操作。www.chinaitp ower
.comc3iWkZh
请注意:在&网格&窗格中输入的任何信息都将在&SQL& 窗格中转换为与区域设置无关的格式,这样,在标准德国计算机上输入的&03.09.65&将转换为 { ts '
00:00:00 }。所有直接输入&SQL&窗格的数据都应该是这种格式,否则,应包含一个明确 CONVERT 调用。www.chinaitp ower
.comc3iWkZh
&结果&窗格中数据的顺序不受&区域设置&的影响,而是由排序规则(请参见本文前面的 SQL Server 2000 的
排序规则)来控制如何解释 ORDER BY 子句。www.chinaitp ower
.comc3iWkZh
双字节 (DBCS) 字符
您可以输入 DBCS 字符作为字面量和数据库对象的名称、别名、参数名以及参数标记字符。但是,您不能使用 DBCS 字符作为 SQL 语言元素,如函数名或 SQL 关键字。因此,您应该使用关键字 SELECT,而不能使用日语全形www.chinaitp ower
.comc3iWkZh
获取 SQL Server 数据(数据访问方法)
您在 SQL Server 中获取数据的方式是至关重要的。访问数据有许多不同的方法,而每种方法处理多种语言文本的规则是十分重要的。以下各节将对这些数据访问方法中的一些进行说明。www.chinaitp ower
.comc3iWkZh
OLE DB 是 Microsoft 数据访问组件 (MDAC) 的核心组件,在 SQL Server 7.0 中使用 MDAC 2.1 版,而在 SQL Server 2000 中使用 MDAC 2.6 版。OLE DB 是建立在 COM 上的,因而所有字符串都是 Unicode BSTR(在 Windows 2000 上为 UTF-16,在所有其他操作系统上为 UCS-2)。对于 SQL Server 来说,提供程序为 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。数据按需要转换为 Unicode,使用实际数据的顺序。最理想的情况是所有过程中数据都保持为 Unicode。www.chinaitp ower
.comc3iWkZh
Microsoft ActiveX& 数据对象是一个脚本友好的 Visual Basic 接口,充当 OLE DB 的包装。它还是一种 COM 组件,因此对 Unicode 的支持是相同的。如果要拆分 ADO 和 OLE DB,这两者之间是不允许产生转换的,因此,如果确实存在问题的话,这些问题始终出在 OLE DB 层。www.chinaitp ower
.comc3iWkZh
ODBC 是否为 Unicode 层取决于正在使用的 ODBC 的版本。有关适用于 ODBC 规则,请参见本文前面的 服务器和客户端之间的通信。www.chinaitp ower
.comc3iWkZh
DB-Library
DB-Library 没有最新的 Unicode 版本。有关详细信息,请参见本文前面的 服务器和客户端之间的通信。www.chinaitp ower
.comc3iWkZh
SQL 分布式管理对象 (SQL-DMO) 是一个 COM 层,它融合了 SQL Server 2000 数据库和复制管理。由于它属于 COM,所以 ADO 和 OLE DB 的规则同样适用于 SQL-DMO。SQL-DMO 还具有一些属性,可用于前面所提到功能,如 SQLServer2、Database2、Column2、SystemDateType2 和 UserDefinedDataType2 对象的 Collation 属性。www.chinaitp ower
.comc3iWkZh
使用多种语言的 Transact-SQL
当您向包含多种语言数据的服务器发送 SQL 语句时,有两个主要的问题将影响数据能否成功到达服务器: www.chinaitp ower
.comc3iWkZh
对 SQL 语句本身的编码
对语句中字符串字面量的编码
对 SQL 语句中字符串字面量的编码
当对 SQL 字符串本身进行编码后,还必须使用处理字符串字面量的技术。从本质上说,这里的唯一选择是计算机默认代码页中的字符串或 Unicode 字符串:后者是通过在字符串前面加一个前缀&n&(代表 National)来注明的,如下所示:www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
如果这里没有加上前缀&n&,该字符串(印地语中的词)将转换为&??????&。对于确实具有代码页的数据,也将发生这种情况,但与系统默认值不匹配。www.chinaitp ower
.comc3iWkZh
警告:注意,在字符串字面量和数据类型(nchar、nvarchar 和 ntext)中使用前缀&n& 表示 Unicode 数据的方法是 SQL Server 特有的。ANSI-92 SQL 规范定义了&National&字符数据类型,但没有规定这种数据类型必须为 Unicode。ANSI-99 SQL 规范(SQL Server 2000 发布时该规范尚未完成,所以就对 Unicode 的支持而言,可能会进行讨论和修改)也的确讨论了使用带有前缀&u&的一组 Unicode 类型(如 utext、uchar 和 uvarchar)。在 SQL Server 2000 中,没有这些数据类型。但在某些其他服务器数据库产品中,情况不是这样。有关详细信息,请参见本文稍后的与其他数据库产品进行交互。www.chinaitp ower
.comc3iWkZh
SQL 字符串编码
如果 SQL 字符串使用 Unicode(例如,就象任何使用 ADO 的 SQL 字符串 一样),则您可以对任何类型的字符进行编码。如果字符串不使用 Unicode(如非 Unicode 批处理文件或 .SQL 文件中的字符串),则转换必须在某处进行,通常,该操作使用进行转换的计算机上的默认系统代码页来进行。在多种语言的应用程序中,如果计划不够周到,这一过程很容易发生问题。www.chinaitp ower
.comc3iWkZh
如果字符串字面量不是 Unicode(标有前缀 n),则将使用数据库的默认代码页将其转换为 Unicode。对于多种语言数据,最好使用 Unicode 数据类型和 Unicode 字符串字面量。www.chinaitp ower
.comc3iWkZh
字符串处理函数
Transact-SQL 具有内置的字符串处理函数,这些函数有一些重要的多种语言注意事项:www.chinaitp ower
.comc3iWkZh
ASCIIwww.chinaitp ower
.comc3iWkZh
使用当前的默认系统代码页返回字符串中第一个字符的代码数据点。如果字符不在该代码页上,将返回 63(问号的代码数据点)。这类似于 Visual Basic 和 VBScript 中的 Asc() 函数。www.chinaitp ower
.comc3iWkZh
CHARwww.chinaitp ower
.comc3iWkZh
返回给定 ANSI 代码数据点的字符;从本质上来说,它是 ASCII 函数的反操作,类似于 Visual Basic 和 VBScript 中的 Chr() 函数。如果代码数据点不在 0-255 范围内,它将返回 Null。www.chinaitp ower
.comc3iWkZh
NCHARwww.chinaitp ower
.comc3iWkZh
CHAR 函数的 Unicode 等价函数。它返回给定 Unicode 代码数据点的字符。类似于 Visual Basic 和 VBScript 中的 ChrW() 函数。www.chinaitp ower
.comc3iWkZh
UNICODEwww.chinaitp ower
.comc3iWkZh
ASCII 函数的 Unicode 等价函数,它返回字符串第一个字符的 Unicode 代码数据点。类似于 Visual Basic 和 VBScript 中的 AscW() 函数。www.chinaitp ower
.comc3iWkZh
请注意:在本文前面的示例中,曾经使用过 NCHAR 函数(请参见日期/时间类型:datetime、smalldatetime)将 RLM(从右至左标记)添加到阿拉伯回历日期的前面,使该日期能够以预期的方式进行格式处理。www.chinaitp ower
.comc3iWkZh
SQL Server 2000 的区域设置支持
SQL Server 2000 中包含对 33 种语言的特定区域设置支持。虽然它未对 Windows 的 NLS 数据库的所有区域设置进行支持,但还是提供了很多基本的功能。下表列出了受支持的语言(用简体中文和本国语表示)。www.chinaitp ower
.comc3iWkZh
SQL Server 2000 和 Windows 2000 中所支持的语言列表www.chinaitp ower
.comc3iWkZh
简体中文翻译
Portugu&s - Brasil
保加利亚语
克罗地亚语
Nederlands
us_english
爱沙尼亚语
拉脱维亚语
罗马尼亚语
斯络伐克语
sloven&ina
斯络文尼亚语
您可以使用 sp_helplanguage 存储过程列举这些语言以及有关这些语言的信息。请注意,虽然各 SQL Server 版本都存储了有关以下所列各项的完整信息,但除非您安装了该产品的本地化版本,否则将无法获得所有区域设置的本地化系统消息。www.chinaitp ower
.comc3iWkZh
有关语言的信息存储在 syslanguages 表中,但消息除外,它们存储在 sysmessages 中。www.chinaitp ower
.comc3iWkZh
每个 SQL Server 必须有默认语言,用于处理日期格式和消息等等。对每个所创建的登录到服务器的帐户都将保存一份这样的信息。虽然此设置最初是在安装过程中设置的,但可以从服务器级别上将其覆盖,方法是在&SQL Server 属性&对话框的&服务器设置&选项卡上进行相应的设置,如图 16 所示。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 16:&SQL Server 语言设置&对话框www.chinaitp ower
.comc3iWkZh
您也可以使用 sp_configure 存储过程,例如以下调用会将默认语言更改为意大利语:www.chinaitp ower
.comc3iWkZh
sp_configure &language&, 6
下表列出了可用的语言 ID (langid)(要查询语言 ID,可以在 syslanguages 表中查找)。www.chinaitp ower
.comc3iWkZh
罗马尼亚语
克罗地亚语
斯络伐克语
斯络文尼亚语
保加利亚语
爱沙尼亚语
拉脱维亚语
使用 sp_addlogin 存储过程或&登录属性&对话框,可以覆盖基于每次登录的默认语言设置,如图 17 所示。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 17:&登录属性&对话框www.chinaitp ower
.comc3iWkZh
最后,还可以使用 SET LANGUAGE 语句在会话级别上覆盖语言设置,如下例所示:www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
应该在字符串前面加上前缀 n,以确保其作为 Unicode 传递。这样,在使用服务器的默认系统代码页进行转换时,可以避免意外问题的发生。www.chinaitp ower
.comc3iWkZh
除了 SET LANGUAGE 调用之外,各个数据访问方法提供自己的指定语言设置的方法: www.chinaitp ower
.comc3iWkZh
ADO 支持 ConnectionString 中特定于提供程序的语言关键字。
OLE DB 可以设置特定于提供程序的 SSPROP_INIT_CURRENTLANGUAGE 属性。
ODBC 可以在数据源定义中或连接字符串的 LANGUAGE 关键字中指定语言。
DB-Library 可以使用 dblogin 分配 LOGINREC,然后使用 DBSETNATLANG 指定语言设置。
语言设置(无论是在服务器、登录级别上指定的,还是在会话级别上指定的)将影响以下各项: www.chinaitp ower
.comc3iWkZh
每周的第一天
货币和货币符号
月/日的名称和月份的缩写
SQL Server 2000 支持功能具有多种特定语言的系统错误字符串和消息文本。这些消息存储在 master 数据库的 sysmessages 表中。当您安装 SQL Server 2000 的本地化版本时,这些系统消息将被翻译成您所安装的语言版本。默认情况下,您还将获得美国英语版本的消息集。您可以使用&设置语言&来设置服务器会话的语言。默认情况下,该语言为所安装版本的语言。当 SQL Server 向连接发送消息时,如果语言 ID 设置与在 sysmessages 表的 msglangid 列中所找到的其中一个语言 ID 相匹配,它将使用本地化消息。这些 ID 的格式为十进制,表示消息的区域设置 ID (LCID)。如果在 sysmessages 表中没有具有相同 LCID 的消息,将发送美国英语消息。www.chinaitp ower
.comc3iWkZh
您可以使用 sp_addmessage 系统存储过程的 @lang 参数,在 sysmessages 表中添加特定语言的用户定义的消息。(错误号应该大于 50,000。)该语言为该消息的 @lang,即映射到 LCID 的已命名别名。www.chinaitp ower
.comc3iWkZh
由于可以在服务器上安装多个特定于语言的系统错误字符串和消息,language 的值将指定把消息写入 sysmessages 表所使用的语言。当省略 language 时使用服务器会话的默认语言。受支持的语言定义存储在 master.dbo.syslanguages 中。如果您必须安装 sysmessages 的多种语言版本,请与您的产品支持服务 (PSS) 代表联系。www.chinaitp ower
.comc3iWkZh
可以对短日期格式进行基本更改:是&mdy&、&dmy&形式,还是&ymd&形式。您可以使用 SET DATEFORMAT 设置,在连接级别上将其覆盖,但需要注意的是,每种语言都有相应的默认值。通过使用 sp_helplanguage 存储过程,可以检索默认值。该值存储在 dateformat 列中。www.chinaitp ower
.comc3iWkZh
每周的第一天
在不同的区域设置中,每周的第一天会有所不同;在 syslanguages 表的 33 种语言中,该设置在 1(星期一)和 7(星期日)之间变化。您可以使用 sp_helplanguage 存储过程来检索这一信息。该值存储在 datefirst 列中。www.chinaitp ower
.comc3iWkZh
货币和货币符号
money 或 smallmoney 类型的任何列都可以包含货币符号。货币符号不一定是在&区域选项&对话框中所指定的符号,它可以是下表所列字符中的任何一个。www.chinaitp ower
.comc3iWkZh
Unicode(十六进制)值
美元符号(美国)
英镑符号(英国)
(通用)货币符号
孟加拉卢比标志
孟加拉卢比符号
克鲁赛罗符号
法国法郎符号
比塞塔符号
新谢克尔符号
您需要注意的是,在 SQL Server 2000 Books Online 中,所列出的欧元符号的十六进制值为 20A0,这是不正确的;其值应为 20AC。20A0 所表示的字符为 ,即欧洲货币 (ECU) 符号。该符号不是欧元,所以不能当作欧元使用;如果试图在货币值中使用,将会导致错误。www.chinaitp ower
.comc3iWkZh
月/日的名称和月份的缩写
月和日的名称包含在 syslanguages 表中。您可以通过 sp_helplanguage 存储过程,使用以下列来检索它们:www.chinaitp ower
.comc3iWkZh
monthswww.chinaitp ower
.comc3iWkZh
用逗号分隔的从一月到十二月的月份名称列表。www.chinaitp ower
.comc3iWkZh
shortmonthswww.chinaitp ower
.comc3iWkZh
用逗号分隔的从一月到十二月的月份名称缩写。www.chinaitp ower
.comc3iWkZh
dayswww.chinaitp ower
.comc3iWkZh
用逗号分隔的从星期一到星期日的一周各天的列表。www.chinaitp ower
.comc3iWkZh
解决 COM 的区域设置冲突
虽然当 SQL Server 在处理日期/时间和货币值时具有某些十分强大的功能,但在您使用任何 COM 服务(如 ADO)访问服务器时,您必须小心其干扰。例如,要让 Visual Basic 知道,以任何货币符号(列在前面的表中)开头的数值就是货币值时,您会遇到问题。在使 COM 正确使用存储在字符串中的日期/时间值时,也会遇到严重问题。www.chinaitp ower
.comc3iWkZh
为了正确解决这种情况,您必须了解应用程序在什么时候将字符串转换为日期/时间或货币值。一旦知道了转换发生在客户端上还是在服务器上,您就可以决定应用哪些规则了。www.chinaitp ower
.comc3iWkZh
Access 2000 ADP 就是这样一种客户端(请参见本文前面的 使用 Access 2000 的新 ADP 格式)。由于 Access 通过 OLE DB 工作,所以 Access 2000 的所有操作都受到 COM 规则的控制,而 COM 规则使用的是客户端计算机的区域设置。www.chinaitp ower
.comc3iWkZh
注&&&OLE DB 提供程序(如 Microsoft OLE DB Provider for SQL Server)将适当地在有效 COM 日期和 SQL Server 日期之间进行转换。尽量不要依赖于字符串中的日期格式,因为这种功能会随着客户端在不同区域设置间变换而突然失效出错。www.chinaitp ower
.comc3iWkZh
数据转换服务
在处理多种语言数据时,&DTS 导入/导出向导&的用户界面中存在一些问题,如图 18 所示。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 18:&DTS 向导&对话框www.chinaitp ower
.comc3iWkZh
该向导一个界面以供处理不同类型的数据。有少量的对话框,用于显示那些没有象 SQL Server Enterprise Manager 和 SQL Query Analyzer 那样完全启用 Unicode 的数据。(请参见本文前面的用户界面中的多种语言数据)。所以您可能会遇到这种情况:虽然向导中的数据显示不正常,但可以正确传递。DTS 操作的可靠性和稳定性是不受这些 UI 限制影响的! 在多数情况下,您只不过不能看到数据而已,因为这些数据将用小方框代替,如图 19 所示。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 19:&DTS 向导&图解www.chinaitp ower
.comc3iWkZh
只是一个 Unicode 文本文件,其中包含简体中文数据。导入完毕后,即可正确处理这些数据,无论是将其导入到 Unicode 文本列还是导入到简体中文文本列。www.chinaitp ower
.comc3iWkZh
但如果您的文本文件所使用的是与系统默认值不匹配的特殊代码页,向导将没有正确的读取该文件的上下文,如图 20 所示。请注意,这种限制并不鲜见。许多程序(包括&记事本&和&写字板&)都不能识别不使用预期代码页的文件。www.chinaitp ower
.comc3iWkZh
www.chinaitp ower
.comc3iWkZh
图 20:使用&DTS 向导&不能正确导入的文件的图解www.chinaitp ower
.comc3iWkZh
该朝鲜语文件不能在使用美国计算机上正确导入,而向导又不允许使用为导入进程指定代码页的方法。(这就是为什么既不能正确显示数据也不能正确导入数据的原因)。就象在许多其它情况下一样,规则是非常明确的:要使用多种语言数据,就应该使用 Unicode。www.chinaitp ower
.comc3iWkZh
在 DTS 转换过程中,可以使用三种对信息编码的规则:您可以选择&use src&、&use dest&或&use collation&。www.chinaitp ower
.comc3iWkZh
&use collation&选项最有可能使您获得希望的结果。在 SQL-DMO 和&DTS 设计器&中,它实际上就是默认值。(在 DTS 向导中,它不是默认值,但很容易设置)。&use collation&选项只有当源和目标都是 SQL Server 2000 数据库时才适用,但它将使用各列的排序规则信息来确定最佳的传递方法。www.chinaitp ower
.comc3iWkZh
另外两个转换选项灵活性不足,它们要求您使用服务器的源代码页或目标代码页来确定转换应该采用的方法。不过,这些设置都过分机械地遵循服务器的代码页设置。虽然它们将考虑特定多实例服务器的排序规则,但它们不支持与服务器不同的数据库排序规则。www.chinaitp ower
.comc3iWkZh
&DTS 转换&操作中的另一个特性具有强大的功能,可使用 SQL Server 实例的 NLS 信息来转换字符串和其他非日期时间数据。对于将日期/时间数据存储为字符串的格式来说,这种关键功能可以使导入过程按用户所希望的那样进行。这是非常重要的,因为并不是所有格式都有象 SQL Server 2000 那么多的数据格式,而 DTS 则是沟通受限制的格式和服务器功能的重要桥梁。www.chinaitp ower
.comc3iWkZh
当源为 SQL Server 7.0 而目标为 SQL Server 2000 时,SQL Server 2000 列的排序规则在 SQL Server 7.0 中表示比较困难,在非 Unicode 列之间移动数据会使 DTS 会发生其他问题 。(反之,源为 SQL Server 2000,目标为 SQL Server 7.0 时也会导致同样的问题)。在这些情况下,默认的方法是在 SQL Server 7.0 端使用服务器代码页。同样,使用 Unicode 数据类型可以防止这种问题发生。www.chinaitp ower
.comc3iWkZh
当您用 DTS 而不是转换来执行复制操作时,将会出现三种可能的情况: www.chinaitp ower
.comc3iWkZh
OLE DB 提供程序列
此选项只复制原始数据,很显然,如果两列在相同的代码页上不包含数据,将会发生问题。当源和目标使用相同代码页时,该选项是快捷的选项,但当在具有使用不同代码页数据的列之间进行复制时,复制将无效。www.chinaitp ower
.comc3iWkZh
NCHAR 到 CHAR
DTS 将自动使用服务器的代码页执行从 Unicode 到其他代码的转换。www.chinaitp ower
.comc3iWkZh
CHAR 到 NCHAR
DTS 将自动使用源服务器的代码页执行从其他代码到 Unicode 的转换。www.chinaitp ower
.comc3iWkZh
DTS 转换问题总结
首先要说明,Unicode 源和目标始终不会出现问题。这一事实是至关重要的。问题仅发生在特定环境中的非 Unicode 数据上。这里将对此进行总结。www.chinaitp ower
.comc3iWkZh
在要创建目标表时: www.chinaitp ower
.comc3iWkZh
当源为 SQL Server 7.0 而 SQL Server 2000 目标服务器代码页与目标数据库代码页不匹配时,转换将失败。
当源为 SQL Server 2000 而目标为 SQL Server 7.0,且源列的排序规则与源服务器代码页不匹配时,转换将失败。
当源和目标为 SQL Server 2000 时,如果没有选中&使用排序规则&,转换将失败,否则,不会丢失任何数据。
在目标表已经存在时: www.chinaitp ower
.comc3iWkZh
当源为 SQL Server 7.0 而 SQL Server 2000 目标服务器代码页与目标列代码页不匹配时,转换将失败。
当源为 SQL Server 2000 而目标为 SQL Server 7.0,且源列的排序规则与源服务器代码页不匹配时,转换将失败。
当源和目标都是 SQL Server 2000 时,只要存在下述情况之一,转换将成功:
源和目标列代码页相匹配且选中了&使用排序规则&。
目标列代码页与目标服务器代码页相匹配且没有选中&使用排序规则&。
如果&使用排序规则&为真,则所传递数据为原始数据。如果为假,数据将转换为源服务器代码页,然后转换到目标列代码页。www.chinaitp ower
.comc3iWkZh
对于复制列转换来说: www.chinaitp ower
.comc3iWkZh
char 到 char 是原始转换。如果源和目标列代码页不匹配,转换将失败。
char 到 Unicode 将把源数据转换为计算机代码页并转换为 Unicode,但如果源数据没有显示在代码页中,转换将失败。
Unicode 到 char 将把数据转换为计算机代码页,而不管目标代码页。这样,如果目标列代码页与计算机的代码页不匹配,转换将失败。
与在其他情况下一样,从 Unicode 到 Unicode 的过程将会正常工作,不会有转换失败或损坏数据的情况,因而成为在使用多种语言数据时的首选。www.chinaitp ower
.comc3iWkZh
使用 bcp 实用程序来处理多种语言数据
当您要从特定的代码页导入数据或将数据导出到特定的代码页时,还可以使用 bcp 实用程序,该实用程序支持下表中所列的标记,用于进行无数据丢失的转换。www.chinaitp ower
.comc3iWkZh
解释和说明
代码页指定标记
xxx 可以将代码页指定为 ANSI、OEM 或 RAW(不进行转换的直接复制,这是最快的选项)。
使用 Unicode 原有的格式
对于所有非字符数据,使用原有的(数据库)数据类型,而对于所有字符数据,则使用 Unicode 字符格式。
使用 Unicode 字符格式
对于所有列,都使用 Unicode 字符数据格式。
您还可以在列级别使用格式文件并指定排序规则。(如果您不指定 -C、-N 或 -w,bcp 将在执行导入/导出之前,实际查询各列、排序规则和代码页的信息)。系统将提醒您保存格式文件,如下面的示例所示(请参见 pubs 数据库中的 authors 表):www.chinaitp ower
.comc3iWkZh
Latin1_General_CI_AI
Latin1_General_CI_AI
Latin1_General_CI_AI
Latin1_General_CI_AI
Latin1_General_CI_AI
Latin1_General_CI_AI
Latin1_General_CI_AI
Latin1_General_CI_AI
所允许的数据类型显示在下表中。排序规则是该列所指定的默认排序规则,它可以是从数据库或服务器继承来的。www.chinaitp ower
.comc3iWkZh
Smalldatetime
Smallmoney
Uniqueidentifier
请注意:该表中没有列出 varchar 和 nvarchar 数据类型。对于 bcp 实用程序来说,char 和 nchar 类型应该分别用于其适当的位置。www.chinaitp ower
.comc3iWkZh
最后,bcp 支持&区域启用&的 -R 标记。该标记与 ODBC&使用区域设置&选项具有相同的效果(请参见本文前面的 服务器和客户端之间的通信),并可以与存储在非文本字段中的日期/时间、数字和货币数据的解释方式相关联。www.chinaitp ower
.comc3iWkZh
Microsoft 的搜索服务和 FTS
许多 Microsoft 产品都使用 Microsoft 搜索服务;该服务本身既用于 SQL Server 2000,又用于 Exchange 2000。引擎与 Index Server 中所使用的引擎一样,将来可能会添加许多其它产品的功能。它最重要的功能是提供提取词干(动词的不规则变化)和特定于语言的单词拆分功能,例如,它使您可以对类似于法语中 l'unique 这样的单词正确编制索引。Microsoft 搜索服务所支持的语言包括: www.chinaitp ower
.comc3iWkZh
英语(英国)
英语(美国)
西班牙语(现代)
除了这些与语言有关的词干提取功能/单词拆分功能外,还提供了一种中性功能供在其他语言中使用。在某些特定情况下,您可能更愿意接受使用特定语言获得的结果,而不愿意接受使用中性语言获得的结果(例如,您可能希望使用西班牙语而不使用加泰罗尼亚语,或希望使用荷兰语而不使用南非公用荷兰语),但对于这些情况官方推荐使用中性选择。因此,建议您根据自己的数据尝试哪种结果更好,而不仅认为&相似&的语言能提供良好的结果。语言支持是非常复杂的,如果您试图提供的数据并不专属该种语言,将导致潜在的不良后果。www.chinaitp ower
.comc3iWkZh
使用 Microsoft 搜索服务以及相关组件的各种提供程序的实际实现细节,大部分都是以您的需要为基础的:如果您在 Exchange 存储中对数据编制索引,Exchange 实现将是首选。但如果您使用的是文件系统,则 Index Server 是首选。显然,如果您使用的是 SQL Server 2000,则 SQL Server 2000 的&全文搜索&是最佳选择。www.chinaitp ower
.comc3iWkZh
Microsoft 搜索服务允许客户使用特定语言&标记&文本区域,以允许在单个数据集中使用多种语言索引,但由于 SQL Server 2000 未提供一种方式来以此法&标记&数据,所以应该在列级别上指定语言。但是,您可以为单个列创建多个索引。如果单个列中有多种语言数据,而您希望执行特定于某种与语言的搜索时,这是一种不错的方法。您可以指定 sp_fulltext_column 的 @language 参数所使用的语言。www.chinaitp ower
.comc3iWkZh
还可以通过对 sp_configure 存储过程使用&默认全文语言&选项,来指定&全文搜索&所使用的默认语言,其调用过程如下所示:www.chinaitp ower
.comc3iWkZh
sp_configure 'show advanced options', 1
RECONFIGURE
sp_configure 'default full-text language', 1041
RECONFIGURE
如果您使用的是默认语言,则不必在对 sp_fulltext_column 的调用中指定语言。www.chinaitp ower
.comc3iWkZh
用户常常会问,如何才能在&全文搜索&中添加对自己所使用语言的支持。很遗憾,当前还没有办法来实现这一功能。www.chinaitp ower
.comc3iWkZh
代理对(请参见本文前面的什么是代理?)在 FTS 或 Microsoft 搜索服务中不受支持。另外,您不能基于这些值可靠地执行搜索,同样,由于该原因,不能对 SQL Server 2000 认为是未定义的任何字符可靠地执行搜索。www.chinaitp ower
.comc3iWkZh
使用 OLAP/分层数据
一般而言,所有有关应用于关系型 SQL Server 2000 的 Unicode 字段中多种语言文本的规则,都同样适用于 SQL Server 2000 的&分析服务&组件所包含的联机分析处理功能 (OLAP)。&分析服务&可以处理 SQL Server 2000 本身所支持的任何字符。在少数情况下,如果这些数据不在客户端系统的默认代码页上,将在 OLAP 及其向导的用户界面上显示为问号。但这不会对实际的数据产生影响,而纯粹是 UI 的显示问题。www.chinaitp ower
.comc3iWkZh
OLAP 有一项功能在 SQL Server 2000 中是不受支持的,即在构成&数据仓库&的分层数据结构的不同部分具有不同排序规则的能力。虽然该功能在数据分析中并不普遍有用,但是它会对某些情况产生影响,例如按字母顺序对数据分区(以进行分析)。在这种情况下,您需要确定其他数据分区方法来明确定义排序和分区,但不使用字母顺序。这对于分层数据的显示非常有用。如果您需要这种功能,则必须对从 OLAP 源返回的数据的子集进行排序。www.chinaitp ower
.comc3iWkZh
使用 SQL Server 2000 的 XML 支持来处理多种语言数据
SQL Server 2000 中丰富的 XML 支持提供了支持多种语言数据的能力,这是因为 XML 本身默认的编码为 UTF-8 Unicode,而且在许多情况下,SQL Server 将在其创建的 XML 中使用 UCS-2 编码方式。您可以使用多种方法指定 XML 中的编码方式: www.chinaitp ower
.comc3iWkZh
如果要将数据作为 ADO 流对象中的 XML 进行格式化,然后保持该流,您可以指定输出编码方式,正确的编码方式将在 XML 格式的数据中标记出来。
您可以在 URL 中指定输出编码方式。
XML 模板可以指定编码方式。
即使您不使用这些方法中的任何一种,默认情况下 Unicode 也受支持并将正常工作。www.chinaitp ower
.comc3iWkZh
有一个重要的问题需要注意,对 XML 中名称所允许使用字符的限制要远远多于 SQL Server 中对标识符所允许使用字符的限制。为了完全支持 SQL Server 标识符,XML 中不受支持的标识符字符被一种特殊形式 _x0000_ 所代替,这里的 0000 将用 Unicode 代码数据点号码替换。SQL Server 将能够正确识别这些字符并将其正确返回。注意,Updategrams 将以任一种方法解释编码方式。然而,只有在您没有映射架构的情况下,才有必要使用它们。www.chinaitp ower
.comc3iWkZh
例如,以下 Transact-SQL 语句不能用于创建使用 UCS-2 编码方式的 XML 文件:www.chinaitp ower
.comc3iWkZh
USE Northwind
SELECT TOP 1 * FROM &Order Details& FOR XML AUTO
DECLARE @h int
EXEC sp_xml_preparedocument @h output,
N'&?xml version=&1.0& encoding=&ucs-2&?&
&root test_x0020_2=&foo&&&/root&'www.chinaitp ower
.comc3iWkZh
SELECT * FROM OPENXML(@h,'/root') WITH(&test 2& varchar(200) )
EXEC sp_xml_removedocument @h
这一小段脚本将创建对西里尔字符串
进行编码的 XML 文档,该字符串正好是表示语言名&乌克兰语&的单词。www.chinaitp ower
.comc3iWkZh
带有注释的架构是随 SQL Server 2000 的 XPath 支持发售的。当前,Web 上的 Updategrams 是测试版,计划在 2001 年上半年在 Web 上发布最终版。按照设计,这两个版本都能正常处理多种语言文本,并支持指定编码方式的方法;它们还支持前面所述的标识符使用语法。www.chinaitp ower
.comc3iWkZh
与其他数据库产品进行交互
当使用其他数据库系统时,您仅需确定该系统的代码页和类似规则即可。SQL Server 端的大部分推荐数据访问方法都涉及到 COM,从而涉及 Unicode 数据的使用。这样,要确定一个国际应用程序使用这些数据访问方法运行的效果如何,您所需要的最主要的信息就是其他数据库产品支持 Unicode 的情况如何。www.chinaitp ower
.comc3iWkZh
例如,其他数据库产品如 Oracle 和 Sybase SQL Server 使用 UTF-8 编码方式支持 Unicode。通常,这不会对您产生影响,因为在您看到信息之前,必须使用 ADO/OLE DB 将数据转换为 UTF-16。但当您尝试直接与这些产品中的数据进行交互时,您应该了解其中的区别。www.chinaitp ower
.comc3iWkZh
另一个您必须考虑到的主要问题是,虽然象 Sybase SQL Server 这样的产品支持&National&字符数据类型,但并不将其视为 Unicode 数据类型。例如,对于这些产品来说,您可以使用 nchar 和 nvarchar 字段将日语数据存储在美国英语数据库中。当您对其他产品运行查询时,了解信息是如何在其他数据库中处理的是非常重要的,只有如此,才能使用 OPENROWSET 这样的命令正确处理国际文本。使用&National&字符数据类型来指定 Unicode 文本是特定于 Microsoft SQL Server 的,以正确处理支持所有语言的编码方式。www.chinaitp ower
.comc3iWkZh
Microsoft SQL Server 2000 包含多种强大的国际功能。SQL Server 7.0 是第一个真正具有多种语言功能的 SQL Server 版本,而建立在其上的 SQL Server 2000 则添加了一组引人注目的功能,使您能够创建真正全球化的应用程序。由于 Internet 和万维网的重要性,应用程序和数据库能够满足这种需求是至关重要的;而不断增长的电子商务和全球化通信则要求数据库产品能够对其提供支持。SQL Server 2000 是全球组织的首选数据库。www.chinaitp ower
.comc3iWkZh
如果没有很多人的辛勤工作,本文是不可能完成的。现在此对他们表示感谢。www.chinaitp ower
.comc3iWkZh
Michael Kung 是 SQL Server 的项目经理,研究着重于全球化支持。他不但为本文的多处提供宝贵的审阅意见材料,并且当我在自己不熟悉的产品领域遇到问题时,还为我推荐合适的咨询人选。他在不同领域的广博知识是一种重要的资源(甚至超出了本文的范围),能够在该项目上获得他的帮助,本人深感荣幸。www.chinaitp ower
.comc3iWkZh
Peter Carlin 是开发经理,其职责包括 SQL Server 关系型引擎。他挤出自己的时间为我提供反馈意见,是我所接触过的人中提供反馈意见最多的人。他还撰写了一封电子邮件,其中包含了大量有关 SQL Server 中 Unicode 支持的重要信息。这封电子邮件实际上就是本文的灵感源泉,从它发展而来的本文是原文大小的 25 倍!www.chinaitp ower
.comc3iWkZh
Fernando Caro 是首席国际化项目经理。他不仅帮助我一一了解 SQL Server 的各个 OLAP 功能,还帮助将有关本地化系统消息的讨论从简短的一句&对不起,不支持&更改为可使读者找到相应资源的指引。我感谢本文使我有机会指出这一不支持的问题,但我更感谢 Fernando 和 Peter 的决定:解决该问题是更重要的。在很大的程度上,由于有了象他们一样总是以任何(合理的)可能的方式来帮助用户的人,才使得 SQL Server 成为了一件伟大的产品。www.chinaitp ower
.comc3iWkZh
此外还要感谢几位项目经理和测试人员的帮助。如果没有他们的帮助,本文就无法对许多分散在整个 SQL Server 产品中的功能进行国际化功能和问题的讨论。这些人员包括:Michael Rys、Euan Garden、Fadi Fakhouri 和 James Howey。我还要感谢 Margaret Li,她使我了解了 SQL Server&全文搜索&所基于的 Microsoft 搜索服务是如何工作的。www.chinaitp ower
.comc3iWkZh
Windows 2000 小组中许多辛勤工作的人员为我提供了许多帮助,例如有关一些基本问题(如排序规则和区域设置支持)应该如何工作的信息,以及提供 SQL Server 7.0 和 2000 的排序规则支持所基于的原始数据。我要特别感谢 Julie Bennett、Cathy Wissink 和 John McConnell,他们有问必答并鼓励我写出这些文字!www.chinaitp ower
.comc3iWkZh
当然,涉及 SQL Server 国际化和多种语言功能的规划、开发和测试的完整人员列表,几乎与参与该产品的人员列表一样长,这是因为这些功能显然不是什么&附件&,而是 SQL Server 2000 的核心部分。因此,我要感谢参与生产这一全球适用的伟大产品的所有人员!www.chinaitp ower
.comc3iWkZh
Michael Kaplan 是 Trigeminal Software, Inc. 的总裁和首席开发人员。该公司是一家软件开发和咨询公司,专门从事 Microsoft Visual Basic、Microsoft SQL Server、Microsoft Access 和 ASP 应用程序的国际化和本地化。他是 Sams Publishing 出版的 &Internationalization with Visual Basic&(Visual Basic 的国际化)一书的作者,其下一部著作 &Internationalization with SQL Server&(SQL Server 的国际化)将在 2001 中期出版。他还撰写了许多文章并就国际化发展发表过论述。他的电子邮件地址是:,Trigeminal Software, Inc. 的网站为 /。www.chinaitp ower
.comc3iWkZh
视频教程列表
文章教程搜索
输入您的搜索字词
提交搜索表单
Sql Server推荐教程
tel:<font color="#FF30058}

我要回帖

更多关于 mssql2000企业版下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信