Я могу связать эту проблему. Например, приложение может вводить пользовательский ввод из электронной таблицы Excel и хранить его в таком формате, как пользователь видит его. Однако в базе данных могут возникнуть другие требования к фильтрации и объединению данных.
Вы решили половину проблемы. Сохраняя значение в поле символа, вы можете хранить то, что хочет пользователь.
Вторая половина - это сохранение значения и разумным способом манипулирования базой данных. Я бы выбрал набор базовых типов, возможно, просто float и datetime, в зависимости от приложения. Затем, когда пользователь вставляет значение, вы можете выполнить преобразование и установить значение в отдельных столбцах. Ваша таблица может иметь столбцы так:
ColumnX_WhatTheUserSees nvarchar(max),
ColumnX_Type char(1) not null default 'C', -- 'C'haracter, 'F'loat, 'D'atetime
ColumnX_Float float,
ColumnX_Datetme
Логика вставки, то выходит что-то вроде этого:
insert into t(ColumnX_WhatTheUSerSees, ColumnX_type, ColumnX_Float, ColumnX_Datetime)
select @ColX,
(case when isnumeric(@Colx) = 1 then 'F'
when isdate(@Colx) = 1 then 'D'
else 'C'
end),
(case when isnumeric(@Colx) = 1 then cast(@Colx as float) end),
(case when isdate(@Colx) = 1 then cast(@Colx as datetime) end)
выше код предназначен только для иллюстрации. Возможно, вам придется обрабатывать особые случаи, которые вам не интересны (возможно, вы думаете, что «1e5» должен быть строкой или вы можете обрабатывать числа с круглыми скобками как отрицательные числа).
Вы можете обрабатывать дополнительную часть обновления через триггер до вставки или до обновления, поэтому пользователь никогда не увидит дополнительной сложности. Вы можете предоставить представление, чтобы пользователь видел только столбцы «WhatTheUserSess».
И, наконец, SQL предлагает тип данных sql_variant
. Это обеспечивает альтернативный маршрут для того, что вы хотите. Однако он потеряет первоначальное форматирование пользователя (что было важно, когда я столкнулся с подобными проблемами).
Это будет не только катастрофа производительности, но и усложнит все ваши запросы, предварительно подтвердив, что значение, которое вам нужно преобразовать, фактически относится к типу данных, который вы хотите. – Lamak