2011-06-29 79 views
4

我需要在數據庫中的所有表中的所有列重新歸類: ​​如何重置數據庫中所有列的排序規則?

我想用數據庫的默認排序

我試圖改變它在數據庫屬性: enter image description here

但整理已列在列中,這意味着我不能覆蓋它

任何人有腳本,可以爲我做?

+0

不要你的意思整理? –

+0

你對!我改變了,謝謝 – Sasha

回答

0

重置列的最快方法是SET UNUSED列,然後添加一個具有相同名稱和數據類型的列。

這將是最快的方式,因爲兩個操作都不會觸及實際的表(僅字典更新)。

列的實際排序會改變(重置列將是最後一列)。如果你的代碼依賴於列的排序(它不應該!),你可以創建一個視圖,該列將以正確的順序排列(重命名錶,創建與舊錶相同名稱的視圖,從基表中撤銷授予,添加贈款查看)。

SET UNUSED方法不會回收列使用的空間(而刪除列將釋放每個塊中的空間)。

希望這會有所幫助。

+0

你能否更新這個更詳細的信息,例如一個實際的腳本,包括如何將數據從舊列轉移到新列(如果有必要)? – David

1

見(更改數據庫整理)http://msdn.microsoft.com/en-us/library/ms174269.aspx

ALTER DATABASE database_name COLLATE collation_name 
+0

(更改列歸類)http://msdn.microsoft.com/en-us/library/ms190273。aspx –

+0

但我需要爲每一列(很多工作)做,即時提問是否有某種腳本自動執行它 – Sasha

+0

如果有任何依賴關係(如列上的索引或全文搜索),那麼這不會沒有工作。 – David

3

我拼成一個腳本,應該做一個足夠體面的工作(希望)。在適當的數據庫中運行腳本,並將結果作爲文本。然後複製粘貼&輸出到一個腳本窗口更改每列的排序規則:

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 

有一點要注意,但是,如果列約束的目標或生成的腳本將無法工作以模式綁定對象(視圖或函數)爲目標。

在這種情況下,您必須腳本化依賴對象,將它們從數據庫中刪除,然後運行上述腳本生成的腳本,最後重新添加依賴對象。

0

建議的腳本(可以找到here)是爲了遍歷數據庫中的所有表並將排序規則更改爲所需的規則。

它是基於腳本:

ALTER TABLE TABLENAME ALTER COLUMN COLUMNNAME varchar(100) COLLATE Latin1_General_CI_AS NULL 
相關問題