2016-09-28 4 views
2

У меня есть несколько столбцов с использованием типа данных bit. Теперь конечный пользователь хочет вариант N/A, поэтому перед тем, как я использовал бит для записи «Да/Нет» (1 - «Да» и «0 - нет»), мне теперь нужно иметь три варианта: Да/Нет/NA, которые я могу хранить как текст в varchar.Преобразование типа данных бит в VarChar в SQL Server

Есть ли способ изменить типы данных столбцов от bit до varchar И также обновить текущие данные записей, где любые 0 меняются на «Нет», а «1» меняют на «Да»?

ответ

8

Почему бы просто не использовать NULL для обозначения «н/д»?

Else use TINYINT с таблицей поиска, содержащей значения 0, 1 и 2 (или, возможно, 1, 2 и 3) и их значения. Затем вы добавляете FK между двумя таблицами, чтобы обеспечить, чтобы вводились только эти значения.

последний выбор должен был бы состоять из столбца CHAR(1). Это было бы нормально , только если вы также указали двоичную сортировку, такую ​​как Latin1_General_100_BIN2. Binary Collation сделает так, что вы не потеряете производительность по сравнению с двумя другими вариантами. Без бинарного столбца колонка строк сравнивает значения с лингвистическими правилами, которые занимают дополнительное время, но не имеют никакого значения для этого использования. Вам также понадобится AFTER INSERT, UPDATE Trigger для первого это значение для согласованности, а затем для обеспечения того, чтобы все значения были либо Y, N, либо A (для «н/д»). Это более читаемо, чем 0, 1 и 2 (через TINYINT) и столь же эффективны для поиска, а также всего 1 байт, но для использования нужно помнить, чтобы указать только буквы верхнего регистра, иначе они могут не получить ожидаемые результаты ,

Там нет причин вообще использовать VARCHAR(3) и хранить полные значения N/A/Yes/No, если вы просто не заботиться о системе становится все медленнее ;-).

+2

+1000 к этому. Битовый тип данных не имеет 2 значения, он имеет 3. 1, 0 и NULL. –

+1

Отличная идея и простейшая реализация, так как я могу оставить только DB и просто изменить код. Благодаря! –

+1

@SeanLange Спасибо :). Не уверен, что вы когда-либо сталкивались с разработкой SilverLight/XAML, но это была единственная среда, которую я видел там, где они предлагали флажок trinary boolean в качестве элемента формы. Вы могли бы проверить его, снимите флажок, а затем отключите его! Unset будет в основном затененным в флажке, явно отличным от галочки. Было очень приятно. –

0
  1. добавить новый столбец VARCHAR
  2. обновление его на основе существующей битовой колонке
  3. удалить битную колонку
  4. (опционально) переименуйте новый столбец с именем старого столбца
0

На самом деле символ (3) будет больше места эффективной

или использовать TINYINT с FK таблицы в соответствии с предложением scutzly

Я был мертв был мертв удивляйтесь, но я могу в состоянии просто преобразовать бит на символ (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

Я не собираюсь спускать вниз, но я укажу, что нет никакой пользы для внесения этого изменения, и на самом деле это замедлит запросы к этому полю и потребует больше места как на диске, так и в пуле буферов. –

Смежные вопросы