在 t-sql 中转换 nvarchar 变量的排序规则

Posted

技术标签:

【中文标题】在 t-sql 中转换 nvarchar 变量的排序规则【英文标题】:Cast collation of nvarchar variables in t-sql 【发布时间】:2010-12-10 13:21:21 【问题描述】:

我需要更改 nvarchar 变量的排序规则。 By documentation:

(...) 3.可以指定COLLATE子句 在几个层面。这些包括 以下:

铸造一个排序规则 表达。您可以使用整理 应用字符表达式的子句 到一定的排序。特点 分配文字和变量 当前的默认排序规则 数据库。列引用是 分配了定义排序规则 列。对于一个整理 表达式,见Collation Precedence (Transact-SQL)。

但是,我无法确定使用 CAST()、CONVERT() 或带有 DECLARE 的变量声明的正确语法。

【问题讨论】:

【参考方案1】:
SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

【讨论】:

这来自这里:msdn.microsoft.com/en-us/library/aa226054%28SQL.80%29.aspx【参考方案2】:

CASTCONVERT 是多余的!

SELECT N'abc' COLLATE French_CS_AS

这是多余的,因为仅更改排序规则不会更改数据类型NVARCHAR

【讨论】:

在这里尝试将 NVARCHAR 转换为指定排序规则的 VARCHAR。 (请注意,可以存储在 VARCHAR 中的实际字符因排序规则而异。) @Joshua 也许这是个错误的问题,因为它与 VARCHAR 无关。【参考方案3】:

如果您在 2 和 1 字节之间进行更改,或者反之亦然,则字符编码必须使用 CAST 或 Convert。在这些情况下,这并不是多余的。

当源列是 2 字节字符序列(nchar、nvarchar)且选择投影需要是单字节字符(char、varchar)时,应指定强制转换和转换。在类型系统之间进行强制转换之前应用排序规则转换。

SELECT CAST(N'ФBC' COLLATE SQL_Latin1_General_CP1_CI_AS as varchar(10)) AS ProjectedSingleByte

【讨论】:

【参考方案4】:

如果您想比较或加入不同排序规则的两列,这可能会有所帮助。 在我的情况下,我必须比较两列,一列使用“SQL_Latin1_General_CP1_CI_AS”,另一列使用“Latin1_General_CP1_CI_AS”。

我只是在加入这两个时使用了这个选项。

关于 A.Person = B.NAME collat​​e database_default

【讨论】:

以上是关于在 t-sql 中转换 nvarchar 变量的排序规则的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地将字符串表示形式转换为 DbType?

将 nvarchar 转换为日期时间/日期后的计算

在 T-SQL 中将 '01-Sep-2017' 转换为 '01/09/2017'?

特定列 -- 将数据类型 nvarchar 转换为 bigint 时出错

T-SQL 替换函数缺少一些使用 nvarchar(max) 的匹配项

T-SQL - 将日期时间转换为未分隔的 ISO 值