【发布时间】: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 的错误的原因是
U和u在区分大小写的排序规则中不一样。如果您解决这些问题并重试怎么办?更改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