簡體   English   中英

如何重置數據庫中所有列的排序規則?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM