最近,我们将数据库从server 2005服务器转移到Server 2008服务器。一切都进行得很好,但是现在我们发现我们得到的是整理冲突。旧服务器与新服务器有不同的排序规则。
现在,我们在移动之前创建的表是一个排序规则,而后面创建的表是另一个排序规则。
是否有方法用旧排序规则将表/列更新为新排序规则?
我理解设置默认数据库/服务器排序规则不会修改任何现有表(链接)。如果没有必要的话,我真的不想重新创建数据库。
任何帮助都很感激。
更新
谢谢你们的帮助,终于成功了。
为了将来参考,下面是我的最后一个脚本:
SELECT 'ALTER TABLE [' + SYSOBJECTS.Name + '] ALTER COLUMN [' + SYSCOLUMNS.Name + '] ' +
SYSTYPES.name +
CASE systypes.NAME
WHEN 'text' THEN ' '
ELSE
'(' + RTRIM(CASE SYSCOLUMNS.length
WHEN -1 THEN 'MAX'
ELSE CONVERT(CHAR,SYSCOLUMNS.length)
END) + ') '
END
+ ' ' + ' COLLATE Latin1_General_CI_AS ' + CASE ISNULLABLE WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END
FROM SYSCOLUMNS , SYSOBJECTS , SYSTYPES
WHERE SYSCOLUMNS.ID = SYSOBJECTS.ID
AND SYSOBJECTS.TYPE = 'U'
AND SYSTYPES.Xtype = SYSCOLUMNS.xtype
AND SYSCOLUMNS.COLLATION IS NOT NULL
AND NOT ( sysobjects.NAME LIKE 'sys%' )
AND NOT ( SYSTYPES.name LIKE 'sys%' )
GO
下面是包含我所基于的脚本的站点。我不得不调整它以使它正常工作。
发布于 2009-12-09 19:27:30
可以使用语句的COLLATE子句更改在用户数据库中创建的任何新对象的排序规则。此语句不执行,而不更改任何现有用户定义表中列的排序规则。可以通过使用变更表的COLLATE子句来更改这些参数。
参考资料:设置和更改数据库排序规则
如果列太多,可以通过SYS.COLUMNS循环应用ALTER语句。
发布于 2010-07-15 08:32:39
为了防止有人使用SQL server 2008查看这一点,我不得不做一些修改:
SELECT 'ALTER TABLE [' + sys.objects.name + '] ALTER COLUMN ['
+ sys.columns.name + '] ' + sys.types.name +
CASE sys.types.name
WHEN 'text' THEN ' '
ELSE
'(' + RTRIM(CASE sys.columns.max_length
WHEN -1 THEN 'MAX'
ELSE CONVERT(CHAR,sys.columns.max_length)
END) + ') '
END
+ ' ' + ' COLLATE Latin1_General_BIN ' + CASE sys.columns.is_nullable WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END
FROM sys.columns , sys.objects , sys.types
WHERE sys.columns.object_id = sys.objects.object_id
AND sys.objects.TYPE = 'U'
AND sys.types.system_type_id = sys.columns.system_type_id
AND sys.columns.collation_name IS NOT NULL
AND NOT ( sys.objects.NAME LIKE 'sys%' )
AND NOT ( sys.types.name LIKE 'sys%' )
发布于 2012-02-17 02:14:23
不如:
DECLARE @collation NVARCHAR(64)
SET @collation = 'Latin1_General_CI_AS'
SELECT
'ALTER TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] '
+ 'ALTER COLUMN [' + COLUMN_NAME + '] '
+ DATA_TYPE + '(' + CASE CHARACTER_MAXIMUM_LENGTH
WHEN -1 THEN 'MAX'
ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) END + ') '
+ 'COLLATE ' + @collation + ' '
+ CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE 'NULL' END
FROM INFORMATION_SCHEMA.columns
WHERE COLLATION_NAME IS NOT NULL
AND COLLATION_NAME <> @collation
https://stackoverflow.com/questions/1878430
复制相似问题