如何在SQL Server 2005上更改AdventureWorks数据库排序规则?

时间:2011-03-20 20:53:44

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

面临的挑战是将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

但我收到了以下错误:

  

Msg 5075,Level 16,State 1,Line 3
  对象'ufnLeadingZeros'依赖于数据库排序规则。该   数据库排序规则无法更改   如果架构绑定对象依赖于   它。删除依赖项   数据库整理然后重试   操作。

     

Msg 5075,Level 16,State 1,Line 3
  对象'CK_ProductReview_Rating'是依赖的   关于数据库整理。数据库   如果a,校对不能改变   架构绑定对象依赖于它。   删除依赖项   数据库整理然后重试   操作

     

Msg 5075,Level 16,State 1,Line 3
  对象'CK_TransactionHistory_TransactionType'   依赖于数据库整理。   数据库整理不可能   如果是模式绑定对象,则更改   取决于它。删除依赖项   在数据库整理然后   重试该操作。

     

Msg 5075,Level 16,State 1,Line 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

我得到了以下错误:

  

Msg 4104,Level 16,State 1,Line 10
  无法绑定多部分标识符“U.Name”。

我试图针对AdventureWorks数据库运行最后一个查询,并且我得到了如上所述的U.Name名称错误,当我尝试对master数据库运行此查询时没有任何反应。

请帮忙!

1 个答案:

答案 0 :(得分:2)

建议从头开始。与上述方法相比,您将花费更少的精力。

下载new copy / scripts for SQL Server 2005 AdventureWorks

确保您的服务器默认具有所需的排序规则。右键单击 - 属性 - >常规 - >服务器整理。

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