Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как изменить базовый тип для sql_variant?  [new]
BJValentine
Member

Откуда:
Сообщений: 127
Всем привет!

Столкнулся с ситуацией когда в запросе столбец sql_variant конвертится в int. На одной базе всё хорошо, на другой аналогичной базе выдаёт ошибку преобразования данных из varchar в int. После недолгих исследований стало понятно, что в первом (рабочем) случае базовый тип var_variant = numeric, а во втором (нерабочем) varchar. Вопрос: как можно поменять этот базовый тип?
7 сен 16, 12:03    [19636647]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
BJValentine
После недолгих исследований стало понятно, что в первом (рабочем) случае базовый тип var_variant = numeric, а во втором (нерабочем) varchar. Вопрос: как можно поменять этот базовый тип?

Оказывается как легко можно решать проблемы конвертации - бац, и поменяли базовый тип.
А вас не посещала мысль, что проблема в самих данных, которые попросту невозможно конвертировать в int?
7 сен 16, 12:13    [19636718]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
BJValentine
Member

Откуда:
Сообщений: 127
Данные абсолютно идентичны.
7 сен 16, 12:20    [19636771]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
BJValentine
Данные абсолютно идентичны.
Да? И откуда же тогда разница в базовом типе?
Еще раз - проблема у вас в самих данных. Ищите различия.
7 сен 16, 12:36    [19636905]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
BJValentine
Member

Откуда:
Сообщений: 127
Данные одни и те же. От чего зависит базовый тип var_variant? Это настройка базы данных или самого значения var_variant?
7 сен 16, 12:54    [19637068]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
BJValentine
Member

Откуда:
Сообщений: 127
Всё, разобрался что такое базовый тип. Он сохраняется в переменной. Вопрос закрыт.
7 сен 16, 13:05    [19637160]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
BJValentine
Данные одни и те же.
Если разный базовый тип в sql_variant, значит уже не одни и те же. Или вы идентичность только визуально оцениваете?

Можете, в качестве костыля, обновить значения в столбце:
update MyTable
 set
  MyColumn = cast(MyColumn as numeric(..))
where
 sql_variant_property(MyColumn, 'BaseType') = 'varchar';

Либо сделайте вычисляемый столбец с двойной конвертацией:
alter MyTable add MyComputedIntColumn as cast(cast(MyColumn as numeric(..)) as int);
И уже им пользуйтесь в запросах.
7 сен 16, 13:20    [19637265]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Честно говоря, ни разу в моей очень долгой жизни тип SQL_VARIANT не потребовался.
BJValentine, может, и вам он не очень-то и нужен? Не говорит ли его применение об ошибках проектирования?
7 сен 16, 13:23    [19637294]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
iap,

для модели EAV
CERATE TABLE 
(
 ReferenceId INT NULL
 ,PropertyId INT NOT NULL
 ,Data SQL_VARIANT NULL
)


Пользуем. Да, нарушает реляционную модель, но удобен в отдельных процессах.
7 сен 16, 13:43    [19637500]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Ken@t
iap,

для модели EAV
CERATE TABLE 
(
 ReferenceId INT NULL
 ,PropertyId INT NOT NULL
 ,Data SQL_VARIANT NULL
)



Пользуем. Да, нарушает реляционную модель, но удобен в отдельных процессах.
У нас исторически (со времён SQL 6.5) для такого дела в таблице заведены отдельные поля разных типов в нужном количестве.
И потом, всё равно же SQL_VARIANT к некоторому определённому типу кастить придётся.
7 сен 16, 13:50    [19637546]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
BJValentine
Member

Откуда:
Сообщений: 127
iap
Честно говоря, ни разу в моей очень долгой жизни тип SQL_VARIANT не потребовался.
BJValentine, может, и вам он не очень-то и нужен? Не говорит ли его применение об ошибках проектирования?


К сожалению не я на проекте архитектор. Я тоже этот тип никогда не использую в своих проектах.

DECLARE
	@A	varchar(128),
	@B	numeric(9,4),
	@C	sql_variant

SELECT
	@A = '4.0',
	@B = 4.0

SELECT @C = @A

SELECT SQL_VARIANT_PROPERTY(@C,'BaseType')

SELECT @C = @B

SELECT SQL_VARIANT_PROPERTY(@C,'BaseType')


В первом случае возвращается varchar, во втором - numeric.
7 сен 16, 14:13    [19637722]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
iap
И потом, всё равно же SQL_VARIANT к некоторому определённому типу кастить придётся.
Придется.
Зато такая таблица легко индексируется.
7 сен 16, 14:19    [19637772]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
invm
iap
И потом, всё равно же SQL_VARIANT к некоторому определённому типу кастить придётся.
Придется.
Зато такая таблица легко индексируется.

Зато, если понадобится, по такой (с SQL_VARIANT) колонке на получится написать детерминированную функцию, т.к. вызовы CAST/CONVERT c SQL_VARIANT-источником недетерминированы.
7 сен 16, 15:10    [19638065]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Сон Веры Павловны
Зато, если понадобится, по такой (с SQL_VARIANT) колонке на получится написать детерминированную функцию
Детерминированную функцию может не получиться написать по колонке любого типа. Зависит еще и от внутренностей функции.

Зачем вообще детерминированность функции, которая вычисляется от значения в столбце, кроме как для использования в индексируемом вычисляемом столбце или индексированном представлении?
7 сен 16, 16:54    [19638710]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
invm,

параллельный план выполнения требует детерменированности, емнип. А для этого требуется привязка к схеме плюс определенность вычислений в функции.
7 сен 16, 17:17    [19638864]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Владислав Колосов
параллельный план выполнения требует детерменированности, емнип. А для этого требуется привязка к схеме плюс определенность вычислений в функции.
http://sqlblog.com/blogs/paul_white/archive/2011/12/23/forcing-a-parallel-query-execution-plan.aspx
Parallelism-Inhibiting Components

There are many things that prevent parallelism, either because they make no sense in a parallel plan, or because the product just does not support them yet. Some of these force the whole plan to run serially, others require a ‘serial zone’ – a part of the plan that runs serially, even though other parts may use multiple threads concurrently.

That list changes from version to version, but for example these things make the whole plan serial on SQL Server 2008 R2 SP1:

Modifying the contents of a table variable (reading is fine)
Any T-SQL scalar function (which are evil anyway)
CLR scalar functions marked as performing data access (normal ones are fine)
Random intrinsic functions including OBJECT_NAME, ENCYPTBYCERT, and IDENT_CURRENT
System table access (e.g. sys.tables)
7 сен 16, 18:24    [19639197]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить базовый тип для sql_variant?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
invm
кроме как для использования в индексируемом вычисляемом столбце или индексированном представлении?

Вот да, именно за этим. Не так давно сам прошелся именно по таким граблям, поэтому и вспомнил.
7 сен 16, 18:41    [19639256]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить