代码
/*
--整理者:永恒de影
--整理时间:2010/06/07
--内容:如何解决"equal to 操作的排序(Japanese_CI_AS和Chinese_PRC_CI_A)规则冲突的问题"
*/
-- ★★★★★★★★★案例描述:★★★★★★★★★★★★★★★★★★★★★★★★★★★
-- 1 我在中文版的数据库下:建立了一个存储过程
-- 2 我想把该存储过程移到 日文版的数据库下
-- 3 在日文版的数据库中执行时出现了以上的问题
-- ★★★★★★★★★发生原因:★★★★★★★★★★★★★★★★★★★★★★★★★★★
-- Microsoft SQL Server 2000 中,字符串的物理存储由排序规则控制。
-- 排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。
-- ★★★★★★★★★解决办法一★★★★★★★★★★★★★★★★★★★★★★★★★★★
-- 在字符型的列充当连接条件时:加上COLLATE database_default (注:字符类型的列)
例:
SELECT D. * ,T. *
FROM #InputTime D
LEFT JOIN [ dbo ] . [ ManuAttemperWG ] T
ON T. [ StationID ] = D. [ StationID ] COLLATE database_default
AND T.InputTime = D.InputTime
AND D.InputDate = T.InputDate
AND T.InputDate = @startDate
WHERE NOT EXISTS (
SELECT 1
FROM [ dbo ] . [ ManuAttemperWG ]
WHERE [ StationID ] = D.StationID COLLATE database_default
AND InputTime = D.InputTime
AND InputDate = @startDate
)
-- ★★★★★★★★★解决办法二★★★★★★★★★★★★★★★★★★★★★★★★★★★
SQL批量更改用户表内字符型字段的排序规则 (注:要修改的列不能被参照)
例:
USE DATABASE
DECLARE @S NVARCHAR ( 1000 )
DECLARE C CURSOR FOR -- 不区分大小写
SELECT ' ALTER TABLE [ ' + B.NAME + ' ] ALTER COLUMN [ ' + A.NAME + ' ] ' + TYPE_NAME (A.XTYPE) +
CASE WHEN TYPE_NAME(A.XTYPE) IN ( ' TEXT ' , ' NTEXT ' ) THEN '' ELSE
QUOTENAME (A.LENGTH, ' ( ' )
END + ' COLLATE CHINESE_PRC_CI_AS '
FROM SYSCOLUMNS A
JOIN SYSOBJECTS B ON A.ID = B.ID AND B.TYPE = ' U '
WHERE TYPE_NAME(A.XTYPE) IN ( ' VARCHAR ' , ' CHAR ' , ' NVARCHAR ' , ' NCHAR ' , ' TEXT ' , ' NTEXT ' )
OPEN C
FETCH C INTO @S
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ( @S )
FETCH C INTO @S
END
CLOSE C
DEALLOCATE C
GO
-- ★★★★★★★★★扩展资料:★★★★★★★★★★★★★★★★★★★★★★★★★★★
-- 1 排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集.如:
-- Chinese_PRC_CS_AI_WS
-- 前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。
-- 排序规则的后半部份即后缀 含义:
-- _BIN 二进制排序
-- _CI(CS) 是否区分大小写,CI不区分,CS区分
-- _AI(AS) 是否区分重音,AI不区分,AS区分
-- _KI(KS) 是否区分假名类型,KI不区分,KS区分
-- _WI(WS) 是否区分宽度 WI不区分,WS区分
-- 区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
-- 区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,比较还将重音不同的字母视为不等。
-- 区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
-- 区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项
-- 2 查看当前系统的排序规则
select serverproperty( ' Collation ' )
-- 3 改变数据库的排序规则(做ALTER之前,要中断所有用户对此数据库的访问)
use master
go
alter database dbname collate Chinese_PRC_CS_AS -- 规则名
--整理者:永恒de影
--整理时间:2010/06/07
--内容:如何解决"equal to 操作的排序(Japanese_CI_AS和Chinese_PRC_CI_A)规则冲突的问题"
*/
-- ★★★★★★★★★案例描述:★★★★★★★★★★★★★★★★★★★★★★★★★★★
-- 1 我在中文版的数据库下:建立了一个存储过程
-- 2 我想把该存储过程移到 日文版的数据库下
-- 3 在日文版的数据库中执行时出现了以上的问题
-- ★★★★★★★★★发生原因:★★★★★★★★★★★★★★★★★★★★★★★★★★★
-- Microsoft SQL Server 2000 中,字符串的物理存储由排序规则控制。
-- 排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。
-- ★★★★★★★★★解决办法一★★★★★★★★★★★★★★★★★★★★★★★★★★★
-- 在字符型的列充当连接条件时:加上COLLATE database_default (注:字符类型的列)
例:
SELECT D. * ,T. *
FROM #InputTime D
LEFT JOIN [ dbo ] . [ ManuAttemperWG ] T
ON T. [ StationID ] = D. [ StationID ] COLLATE database_default
AND T.InputTime = D.InputTime
AND D.InputDate = T.InputDate
AND T.InputDate = @startDate
WHERE NOT EXISTS (
SELECT 1
FROM [ dbo ] . [ ManuAttemperWG ]
WHERE [ StationID ] = D.StationID COLLATE database_default
AND InputTime = D.InputTime
AND InputDate = @startDate
)
-- ★★★★★★★★★解决办法二★★★★★★★★★★★★★★★★★★★★★★★★★★★
SQL批量更改用户表内字符型字段的排序规则 (注:要修改的列不能被参照)
例:
USE DATABASE
DECLARE @S NVARCHAR ( 1000 )
DECLARE C CURSOR FOR -- 不区分大小写
SELECT ' ALTER TABLE [ ' + B.NAME + ' ] ALTER COLUMN [ ' + A.NAME + ' ] ' + TYPE_NAME (A.XTYPE) +
CASE WHEN TYPE_NAME(A.XTYPE) IN ( ' TEXT ' , ' NTEXT ' ) THEN '' ELSE
QUOTENAME (A.LENGTH, ' ( ' )
END + ' COLLATE CHINESE_PRC_CI_AS '
FROM SYSCOLUMNS A
JOIN SYSOBJECTS B ON A.ID = B.ID AND B.TYPE = ' U '
WHERE TYPE_NAME(A.XTYPE) IN ( ' VARCHAR ' , ' CHAR ' , ' NVARCHAR ' , ' NCHAR ' , ' TEXT ' , ' NTEXT ' )
OPEN C
FETCH C INTO @S
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ( @S )
FETCH C INTO @S
END
CLOSE C
DEALLOCATE C
GO
-- ★★★★★★★★★扩展资料:★★★★★★★★★★★★★★★★★★★★★★★★★★★
-- 1 排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集.如:
-- Chinese_PRC_CS_AI_WS
-- 前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。
-- 排序规则的后半部份即后缀 含义:
-- _BIN 二进制排序
-- _CI(CS) 是否区分大小写,CI不区分,CS区分
-- _AI(AS) 是否区分重音,AI不区分,AS区分
-- _KI(KS) 是否区分假名类型,KI不区分,KS区分
-- _WI(WS) 是否区分宽度 WI不区分,WS区分
-- 区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
-- 区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,比较还将重音不同的字母视为不等。
-- 区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
-- 区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项
-- 2 查看当前系统的排序规则
select serverproperty( ' Collation ' )
-- 3 改变数据库的排序规则(做ALTER之前,要中断所有用户对此数据库的访问)
use master
go
alter database dbname collate Chinese_PRC_CS_AS -- 规则名