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

Откуда:
Сообщений: 68
Привет!

Дано:
create table a (id integer not null primary key);

create table b (id bigint  not null primary key);    -- bigint !!!

CREATE VIEW v as 
select 
	cast(id as varchar (15)) as cid,
	id
from a
union 
select 
	cast(id as varchar (15)) as cid,
	id
from b;

insert into a values (1);
insert into b values (11111111111111);


Теперь делаем запрос
select *
from v
where cid = cast (1 as bigint);
Сообщение 248, уровень 16, состояние 1, строка 2
Преобразование значения "11111111111111" типа varchar привело к переполнению столбца типа int.


Вот план запроса
set showplan_all on;

select *  from v  where cid = 1;
  |--Sort(DISTINCT ORDER BY:([Union1009] ASC, [Union1010] ASC))
       |--Concatenation
            |--Compute Scalar(DEFINE:([Expr1003]=CONVERT(varchar(15),[via_5r_rl].[dbo].[a].[id],0), [Expr1004]=CONVERT_IMPLICIT(bigint,[via_5r_rl].[dbo].[a].[id],0)))
            |    |--Clustered Index Scan(OBJECT:([via_5r_rl].[dbo].[a].[PK__a__3213E83F6E8B6712]), WHERE:(CONVERT_IMPLICIT(int,CONVERT(varchar(15),[via_5r_rl].[dbo].[a].[id],0),0)=(1)))
            |--Compute Scalar(DEFINE:([Expr1008]=CONVERT(varchar(15),[via_5r_rl].[dbo].[b].[id],0)))
                 |--Clustered Index Scan(OBJECT:([via_5r_rl].[dbo].[b].[PK__b__3213E83F725BF7F6]), WHERE:(CONVERT_IMPLICIT(int,CONVERT(varchar(15),[via_5r_rl].[dbo].[b].[id],0),0)=(1)))


Пожалуйста, прокоментируйте эту строку:
CONVERT_IMPLICIT(int,CONVERT(varchar(15),[via_5r_rl].[dbo].[b].[id]
это бага? фича? или что?

Вот эти варианты работают:
select *
from v
where cid = cast (1 as bigint) or cid = '1';


версия 10.0.5500 (2008SP3)
28 сен 12, 19:32    [13240892]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по convert_implicit  [new]
step_ks
Member

Откуда:
Сообщений: 936
работает нормально на
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) 
Jun 17 2011 00:57:23
Copyright (c) Microsoft Corporation
Express Edition with Advanced Services on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

StmtText                                                                                                                                                                                
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
SELECT * FROM [v] WHERE [cid]=CONVERT([bigint],@1,0)                                                                                                                                    
  |--Sort(DISTINCT ORDER BY:([Union1009] ASC, [Union1010] ASC))                                                                                                                         
       |--Concatenation                                                                                                                                                                 
            |--Compute Scalar(DEFINE:([Expr1003]=CONVERT(varchar(15),[tempdb].[dbo].[a].[id],0), [Expr1004]=CONVERT_IMPLICIT(bigint,[tempdb].[dbo].[a].[id],0)))                        
            |    |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[a].[PK__a__3213E83F34C8D9D1]), WHERE:(CONVERT_IMPLICIT(bigint,CONVERT(varchar(15),[tempdb].[dbo].[a].[id],0),0)=(1)))  
            |--Compute Scalar(DEFINE:([Expr1008]=CONVERT(varchar(15),[tempdb].[dbo].[b].[id],0)))                                                                                       
                 |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[b].[PK__b__3213E83F38996AB5]), WHERE:(CONVERT_IMPLICIT(bigint,CONVERT(varchar(15),[tempdb].[dbo].[b].[id],0),0)=(1)))  
28 сен 12, 20:06    [13241006]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по convert_implicit  [new]
Roman OL
Member

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

Да, спасибо, с явным указанием типа и у меня работает.

Похоже здесь нет вопроса - так и должно быть. И как я припоминаю, так стало при переходе 2000 --> 2005 ?
Но что-то на msdn не ищется, может кто-то сбросит ссылку?
28 сен 12, 20:13    [13241032]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по convert_implicit  [new]
step_ks
Member

Откуда:
Сообщений: 936
Roman OL
step_ks,

Да, спасибо, с явным указанием типа и у меня работает.


Чего? Я выполнял запрос, который у вас вызывает ошибку.
28 сен 12, 20:19    [13241057]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по convert_implicit  [new]
step_ks
Member

Откуда:
Сообщений: 936
А,так вы запрос показываете один, а в плане у вас другой. Путаете.

Т.е. на самом деле у вас вылетает запрос
select *  from v  where cid = 1


Ничего удивительного.
28 сен 12, 20:54    [13241202]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить