Skip to content

Что это за тип данных 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 - забавная штука, с которой можно поиграть, и которая даже может занять свое место в вашем коде. Это не распространенная вещь, но, если вы используете её, то должны принять во внимание вышеизложенное.
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.