我有一些列使用bit
數據類型。最終用戶現在想要一個N/A選項,所以之前我用一點來捕獲「是/否」(1爲yes,0爲no),現在我需要有三個選項是/否/ NA,我可以存儲就像varchar
中的文字一樣。將位數據類型轉換爲SQL Server中的VarChar
是否有辦法將列的數據類型從bit
更改爲varchar
並更新當前記錄數據,其中任何0的狀態變爲「否」,1的狀態變爲「是」?
我有一些列使用bit
數據類型。最終用戶現在想要一個N/A選項,所以之前我用一點來捕獲「是/否」(1爲yes,0爲no),現在我需要有三個選項是/否/ NA,我可以存儲就像varchar
中的文字一樣。將位數據類型轉換爲SQL Server中的VarChar
是否有辦法將列的數據類型從bit
更改爲varchar
並更新當前記錄數據,其中任何0的狀態變爲「否」,1的狀態變爲「是」?
爲什麼不使用NULL
來表示「不適用」?
否則使用TINYINT
與包含值0,1和2(或可能是1,2和3)及其含義的查找表。然後在兩個表之間添加FK以強制只輸入這些值。
最後選擇將與CHAR(1)
列一起去。如果您還指定了二進制排序規則,例如Latin1_General_100_BIN2
,那麼這將是確定的。二進制整理將使其不會失去其他兩個選項的性能。如果沒有二進制排序規則,字符串列會根據語言規則比較值,這會花費額外的時間,但對此用法沒有意義。您還需要一個AFTER INSERT, UPDATE
爲了保持一致性,先觸發此值爲UPPER()
,然後強制執行所有值爲Y
,N
或A
(對於「n/a」)。這比0,1和2(通過TINYINT
)更具可讀性,對於搜索同樣有效,並且也只有1個字節,但BUT的使用只需要記住只指定大寫字母,否則它們可能不會獲得預期的結果。
有一個在所有沒有理由使用VARCHAR(3)
並存儲滿值N/A
/Yes
/No
,除非你只是不關心繫統越來越慢;-)。
其實CHAR(3)會更節省空間
或使用TINYINT與FK表由scutzly
我已經死了的建議是死感到驚訝,但我能只是轉換位爲char(3 )在SSMS中右鍵單擊設計。
Alter Table TableName
Alter Column ColumnName Varchar(3)
Update TableName
Set ColumnName = 'Yes'
Where ColumnName = '1'
Update TableName
Set ColumnName = 'No'
Where ColumnName = '0'
我不會失望,但我會指出,進行此更改絕對沒有任何好處,事實上,它會減慢對此字段的查詢速度,並且需要在磁盤和緩衝池中佔用更多空間。 –
+1000這個。有點數據類型沒有2個值,它有3.1,0和NULL。 –
偉大的想法和最簡單的實現,因爲我可以離開數據庫,只是改變代碼。謝謝! –
@SeanLange謝謝:)。不知道你是否曾經與SilverLight開發/ XAML混淆過,但那是我看到他們提供三元布爾複選框作爲表單元素的唯一環境。你實際上可以檢查它,取消選中,然後取消設置!取消設置將是複選框中的大部分陰影,與複選標記明顯不同。這很不錯。 –