[英]how do I reset collation for all columns in the database?
我需要為數據庫中所有表中的所有列重置排序規則:
我想使用數據庫的默認排序規則
我試圖在數據庫屬性下更改它:
但排序規則已經在列中設置,這意味着我無法覆蓋它
有人有可以為我做的腳本嗎?
我已經拼湊了一個應該做得足夠體面的腳本(希望如此)。 在適當的數據庫中運行腳本,結果為文本。 然后將 output 復制並粘貼到腳本 window 中以更改每列的排序規則:
declare @NewCollationName sysname
set @NewCollationName = 'Latin1_General_CS_AS'
select
'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(st.schema_id)) + '.' + QUOTENAME(st.name) +
' ALTER COLUMN ' + QUOTENAME(sc.name) + ' ' + styp.name + '(' +
CASE WHEN sc.max_length = -1 THEN 'max' ELSE CONVERT(varchar(10),sc.max_length) END +
') collate ' + @NewCollationName + '
go
'
from
sys.columns sc
inner join
sys.tables st
on
sc.object_id = st.object_id
inner join
sys.types styp
on
sc.user_type_id = styp.user_type_id
where
sc.collation_name is not null and
OBJECTPROPERTY(st.object_id,N'IsMSShipped')=0
然而,需要注意的一點是,如果列是約束的目標或由模式綁定 object(視圖或函數)作為目標,則生成的腳本將不起作用。
在這種情況下,您必須編寫依賴對象的腳本,將它們從數據庫中刪除,然后運行上面腳本生成的腳本,最后重新添加依賴對象。
請參閱(更改數據庫排序規則) http://msdn.microsoft.com/en-us/library/ms174269.aspx
ALTER DATABASE database_name COLLATE collation_name
建議的腳本(可以在此處找到)旨在遍歷數據庫中的所有表並將排序規則更改為所需的排序規則。
它基於腳本:
ALTER TABLE TABLENAME ALTER COLUMN COLUMNNAME varchar(100) COLLATE Latin1_General_CI_AS NULL
重置列的最快方法是 SET UNUSED 列,然后添加具有相同名稱和數據類型的列。
這將是最快的方式,因為這兩個操作都不會觸及實際的表(僅字典更新)。
列的實際順序將被更改(重置列將是最后一列)。 如果您的代碼依賴於列的順序(它不應該),您可以創建一個視圖,該視圖將具有正確順序的列(重命名表,創建與舊表同名的視圖,撤銷基表的授權。添加授權以查看)。
SET UNUSED 方法不會回收列使用的空間(而刪除列將釋放每個塊中的空間)。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.