Что это за тип данных SQL_VARIANT?
Пересказ статьи Kenneth Fisher. What is the datatype SQL VARIANT
Тип данных SQL_VARIANT - интересный зверь. Это тип данных, который может хранить большинство типов данных. Т.е. date, decimal, int, varchar и т.п. могут сохраняться в единственном типе данных. Звучит здорово, не так ли? Ну, тут есть несколько проблем.
Какой тип данных хранится?
Прежде всего, поскольку у вас имеется так много различных типов данных, вам не обязательно знать, какой тип данных у вас там находится. К счастью, есть простое решение. Вы можете использовать функцию sql_variant_property. Подобно другим подобным функциям, имеется множество выводимых свойств, но нам здесь потребуется одно - BaseType. Достаточно интересно, что вы можете также использовать sql_variant_property для получения информации о большинстве переменных. (Но не о табличных переменных).
DECLARE @MyVariant sql_variant = 4;
SELECT sql_variant_property(@MyVariant ,'basetype');
-- int
DECLARE @MyInt INT = 4;
SELECT sql_variant_property(@MyInt,'basetype');
-- int
Неявные преобразования
Вы обычным образом можете неявно конвертировать другие типы данных в sql_variant
/* Это работает, поскольку @MyVariant изначально varchar целочисленное значение @MyInt неявно конвертируется к sql_variant и переписывает не только значение, но и текущий базовый тип @MyVariant. */
DECLARE @MyVariant sql_variant = 'test';
DECLARE @MyInt int = 4;
SET @MyVariant = @MyInt;
Вы не можете выполнить обратное преобразование
/* Это не работает, поскольку, хотя базовый тип обеих переменных varchar, фактический тип данных @MyVariant есть sql_variant, который не может быть неявно преобразован к какому-либо другому типу данных. */
DECLARE @MyVariant sql_variant = 'test';
DECLARE @MyInt int = 4;
SET @MyInt = @MyVariant;
Это означает, что в целях осторожности вам необходимо явно преобразовать переменную sql_variant, поле и т.д. в ожидаемый тип данных. Это также подразумевает, что вам нужно принять на вооружение также try_convert и try_cast.
Следует отметить и некоторые другие интересные эффекты. Например, команда PRINT ожидает строку (char, nchar, varchar и nvarchar), поэтому потерпит неудачу при попытке неявно преобразовать sql_variant.
DECLARE @MyVariant sql_variant = 'test';
PRINT @MyVariant;
Сообщение 257, уровень 16, состояние 3, строка 2
Неявное преобразование из типа данных sql_variant в nvarchar не разрешено. Для выполнения этого запроса используйте функцию CONVERT.
А в некоторых случаях, когда мы не ожидаем неявного преобразования, оно происходит.
DECLARE @MyVariant sql_variant = '01/01/2020 12:31 AM';
SELECT sql_variant_property (@MyVariant, 'basetype');
-- varchar
Выводы
Так или иначе, sql_variant - забавная штука, с которой можно поиграть, и которая даже может занять свое место в вашем коде. Это не распространенная вещь, но, если вы используете её, то должны принять во внимание вышеизложенное.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой