2016-09-28 106 views
2

我有一些列使用bit數據類型。最終用戶現在想要一個N/A選項,所以之前我用一點來捕獲「是/否」(1爲yes,0爲no),現在我需要有三個選項是/否/ NA,我可以存儲就像varchar中的文字一樣。將位數據類型轉換爲SQL Server中的VarChar

是否有辦法將列的數據類型從bit更改爲varchar並更新當前記錄數據,其中任何0的狀態變爲「否」,1的狀態變爲「是」?

回答

8

爲什麼不使用NULL來表示「不適用」?

否則使用TINYINT與包含值0,1和2(或可能是1,2和3)及其含義的查找表。然後在兩個表之間添加FK以強制只輸入這些值。

最後選擇將與CHAR(1)列一起去。如果您還指定了二進制排序規則,例如Latin1_General_100_BIN2,那麼這將是確定的。二進制整理將使其不會失去其他兩個選項的性能。如果沒有二進制排序規則,字符串列會根據語言規則比較值,這會花費額外的時間,但對此用法沒有意義。您還需要一個AFTER INSERT, UPDATE爲了保持一致性,先觸發此值爲UPPER(),然後強制執行所有值爲Y,NA(對於「n/a」)。這比0,1和2(通過TINYINT)更具可讀性,對於搜索同樣有效,並且也只有1個字節,但BUT的使用只需要記住只指定大寫字母,否則它們可能不會獲得預期的結果。

有一個在所有沒有理由使用VARCHAR(3)並存儲滿值N/A/Yes/No,除非你只是不關心繫統越來越慢;-)。

+2

+1000這個。有點數據類型沒有2個值,它有3.1,0和NULL。 –

+1

偉大的想法和最簡單的實現,因爲我可以離開數據庫,只是改變代碼。謝謝! –

+1

@SeanLange謝謝:)。不知道你是否曾經與SilverLight開發/ XAML混淆過,但那是我看到他們提供三元布爾複選框作爲表單元素的唯一環境。你實際上可以檢查它,取消選中,然後取消設置!取消設置將是複選框中的大部分陰影,與複選標記明顯不同。這很不錯。 –

0
  1. 添加一個新的VARCHAR列它基於現有位列
  2. 更新刪除位列
  3. (optionaly)重命名新列老列的名稱
0

其實CHAR(3)會更節省空間

或使用TINYINT與FK表由scutzly

我已經死了的建議是死感到驚訝,但我能只是轉換位爲char(3 )在SSMS中右鍵單擊設計。

0
Alter Table TableName 
Alter Column ColumnName Varchar(3) 

Update TableName 
Set ColumnName = 'Yes' 
Where ColumnName = '1' 

Update TableName 
Set ColumnName = 'No' 
Where ColumnName = '0' 
+0

我不會失望,但我會指出,進行此更改絕對沒有任何好處,事實上,它會減慢對此字段的查詢速度,並且需要在磁盤和緩衝池中佔用更多空間。 –

相關問題