【问题标题】:How to change AdventureWorks database collation on SQL Server 2005?如何更改 SQL Server 2005 上的 AdventureWorks 数据库排序规则?
【发布时间】:2011-07-19 06:57:55
【问题描述】:

挑战是将AdventureWorks 数据库的排序规则从Latin1_General_CS_AS 更改为SQL_Latin1_General_CP1_CI_AS。有人知道怎么做吗?

我试过了:

alter database AdventureWorks set single_user
alter database AdventureWorks collate SQL_Latin1_General_CP1_CI_AS
alter database AdventureWorks set multi_user

但我收到以下错误:

消息 5075,第 16 级,状态 1,第 3 行
对象“ufnLeadingZeros”依赖于数据库排序规则。这 无法更改数据库排序规则 如果模式绑定对象依赖于 它。删除对 数据库排序,然后重试 手术。

消息 5075,第 16 级,状态 1,第 3 行
对象“CK_ProductReview_Rating”是依赖的 关于数据库整理。数据库 排序规则不能更改,如果 模式绑定对象依赖于它。 删除对 数据库排序,然后重试 操作。

消息 5075,第 16 级,状态 1,第 3 行
对象“CK_TransactionHistory_TransactionType” 依赖于数据库排序规则。 数据库排序规则不能 如果是模式绑定对象,则更改 取决于它。删除依赖项 在数据库排序规则上,然后 重试操作。

消息 5075,第 16 级,状态 1,第 3 行
对象“CK_ProductVendor_AverageLeadTime”是 依赖于数据库排序规则。这 无法更改数据库排序规则 如果模式绑定对象依赖于 它。删除对 数据库排序,然后重试 操作。

然后我正在尝试这样的事情:

DECLARE @NewCollation VARCHAR(255), @DBName sysname

SELECT @NewCollation = 'SQL_Latin1_General_CP1_CI_AS', -- change this to the collation that you need
       @DBName = DB_NAME()

DECLARE @CName varchar(255), 
        @TbleName sysname, 
        @objOwner sysname, 
        @Sql varchar(8000), 
        @Size int, 
        @Status tinyint, 
        @Colorder int

Declare CurWhileLoop cursor read_only forward_only local
for Select
       QUOTENAME(C.Name)
      ,T.Name
      ,QUOTENAME(U.Name) + '.' +QUOTENAME(O.Name)
      ,C.Prec
      ,C.isnullable
      ,C.colorder
    From syscolumns C
      inner join systypes T on C.xtype=T.xtype
      inner join sysobjects O on C.ID=O.ID
      inner join sysusers u on O.uid = u.uid
    where T.Name in ('varchar', 'char', 'text', 'nchar', 'nvarchar', 'ntext')
      and O.xtype in ('U')
      and C.collation != @NewCollation
    and objectProperty(O.ID, 'ismsshipped')=0
    order by 3, 1

open CurWhileLoop
SET XACT_ABORT ON
begin tran
fetch CurWhileLoop into @CName, @TbleName, @objOwner, @Size, @Status, @Colorder
while @@FETCH_STATUS =0
begin
  set @Sql='ALTER TABLE '+@objOwner+' ALTER COLUMN '+@CName+' '+@TbleName+ isnull ('('
+convert(varchar,@Size)+')', '') +' COLLATE '+ @NewCollation
+' '+case when @Status=1 then 'NULL' else 'NOT NULL' end
  exec(@Sql) -- change this to print if you need only the script, not the action
  fetch CurWhileLoop into @CName, @TbleName, @objOwner, @Size, @Status, @Colorder
end
close CurWhileLoop
deallocate CurWhileLoop
commit tran

我收到以下错误:

消息 4104,第 16 级,状态 1,第 10 行
无法绑定多部分标识符“U.Name”。

我试图对AdventureWorks 数据库运行最后一个查询,但出现上述 U.Name 名称错误,当我试图对 master 数据库运行此查询时,没有任何反应。

请帮忙!

【问题讨论】:

  • 您的脚本中针对 AdventureWorks 的错误的原因是 Uu 在区分大小写的排序规则中不一样。如果您解决这些问题并重试怎么办?更改master 的排序规则的唯一方法是重建它。
  • 当我修复这个 U 问题时,我得到了这个:Msg 102, Level 15, State 1, Line 1 ')' 附近的语法错误。 :(
  • convert(varchar,@Size) 应该是 case when @Size = -1 THEN 'Max' else convert(varchar,@Size) end 请注意,这 still 只会更改列的排序规则而不是 DB。您还需要删除问题约束等,更改 database 排序规则并将它们添加回来。
  • 你能粘贴/发给我一个完整的脚本吗?
  • 无论如何,非常感谢马丁!非常感谢!!

标签: sql-server sql-server-2005 tsql collation


【解决方案1】:

建议从头开始。与上面的方法相比,它会花费更少的精力。

下载new copy / scripts for SQL Server 2005 AdventureWorks

确保您的服务器默认具有您想要的排序规则。右键-Properties->General->Server Collat​​ion。

当您使用 SQL Server Management Studio 创建数据库时,您可以明确选择排序规则。

【讨论】:

  • 但是在你给我的页面上有安装组件。没有脚本?或者也许我看不到他们...... :(
  • 正确的答案是使用带有 CI 后缀的新安装文件。 (AdventureWorksDBCI.msi)!!
猜你喜欢
  • 2011-03-28
  • 2012-09-26
  • 2011-04-08
  • 2014-11-25
  • 2011-11-14
  • 2012-02-22
  • 2010-10-25
  • 1970-01-01
  • 2016-11-17
相关资源
最近更新 更多