Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Ошибка преобразования varchar в int  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1415
Второй час бьюсь с этой ошибкой, но просветления в чем проблема не приходит. Есть запрос вида:
SELECT        dbo.Object.ObjectID, COALESCE (dbo.VInformation.ObjectInfo, dbo.VLawQualify.ObjectInfo) AS Expr1
FROM            dbo.Object LEFT OUTER JOIN
                         dbo.VInformation ON dbo.Object.ObjectID = dbo.VInformation.ObjectID LEFT OUTER JOIN
                         dbo.VLawQualify ON dbo.Object.ObjectID = dbo.VLawQualify.ObjectID

ObjectInfo может хранить строковое значение или null.
По отдельности запросы VInformation и VLawQualify выполняются без ошибок, но вот в таком варианте я получаю ошибку преобразования в int. Откуда вообще берется преобразование непонятно. Возможно что происходит попытка вычислить текстовое значение '5/10-А', на котором собственно и вылетает ошибка, но применение cast, convert эту ошибку не убирают.
Замена COALESCE на CASE порождает ту-же ошибку. Есть идеи?
31 авг 18, 12:18    [21660048]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7769
Страдалецъ,

жените атрибуты разных типов данных, отсюда и ошибка.
31 авг 18, 12:20    [21660056]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
Страдалецъ
Возможно что происходит попытка вычислить текстовое значение '5/10-А', на котором собственно и вылетает ошибка, но применение cast, convert эту ошибку не убирают.
Замена COALESCE на CASE порождает ту-же ошибку. Есть идеи?
Очевидно, вы неправильно применили cast, convert.
Сначала расскажите алгоритм преобразований данных, которые вы хотите выполнить в данном запросе, простыми словами, себе, а потом уже легко напишется и правильный запрос на SQL.
31 авг 18, 12:33    [21660088]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1415
Вот только где они эти разные типы? Источники данных для COALESCE по отдельности ошибок не дают. Оба источника возвращают либо строку, либо null и вот в этом видимо и засада, но ведь COALESCE и должен сделать выбор как для таких данных.
31 авг 18, 12:34    [21660094]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Страдалецъ
Вот только где они эти разные типы? Источники данных для COALESCE по отдельности ошибок не дают. Оба источника возвращают либо строку, либо null и вот в этом видимо и засада, но ведь COALESCE и должен сделать выбор как для таких данных.

просто скажите тип данных для обоих ObjectInfo
31 авг 18, 12:35    [21660095]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7769
Страдалецъ,

сохраните результат, например, в таблице и посмотрите ее структуру.

sp_help 'схема.таблица'
31 авг 18, 12:36    [21660098]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
Страдалецъ
Вот только где они эти разные типы? Источники данных для COALESCE по отдельности ошибок не дают. Оба источника возвращают либо строку, либо null и вот в этом видимо и засада, но ведь COALESCE и должен сделать выбор как для таких данных.
Посмотрите все поля, участвующие в запросе.
Очевидно, ошибка будет там, где поле типа INT как то взаимодействует с полем типа VARCHAR
Может, это поле dbo.VInformation.ObjectID, dbo.Object.ObjectID, dbo.VLawQualify.ObjectID, dbo.VInformation.ObjectInfo, dbo.VLawQualify.ObjectInfo
Вот для начала составьте список типов этих полей
31 авг 18, 12:37    [21660099]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
TaPaK
Страдалецъ
Вот только где они эти разные типы? Источники данных для COALESCE по отдельности ошибок не дают. Оба источника возвращают либо строку, либо null и вот в этом видимо и засада, но ведь COALESCE и должен сделать выбор как для таких данных.

просто скажите тип данных для обоих ObjectInfo
Может, у него при джойне ошибка, может, какой то ID целочисленный, а какой то строка?
ТС же не показал ошибку.
31 авг 18, 12:39    [21660105]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alexeyvg
TaPaK
пропущено...

просто скажите тип данных для обоих ObjectInfo
Может, у него при джойне ошибка, может, какой то ID целочисленный, а какой то строка?
ТС же не показал ошибку.

ну я расшифоровываю "Источники данных для COALESCE по отдельности ошибок не дают" как тот же запрос только COALESE другой, но всё имеет право на жизнь :)
31 авг 18, 12:40    [21660108]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1415
Ну вот текст ошибки.
---------------------------
Microsoft SQL Server Management Studio
---------------------------
SQL Execution Error.

Executed SQL statement: SELECT dbo.Object.ObjectID, COALESCE (dbo.VLawQualify.ObjectInfo, dbo.VInformation.ObjectInfo) AS Expr1 FROM dbo.Object LEFT OUTER JOIN dbo.VInformation ON dbo.Object.ObjectID = dbo.VInformation.ObjectID LEFT OUTER JOIN dbo.VLawQualify ON dbo.Object....
Error Source: .Net SqlClient Data Provider
Error Message: Ошибка преобразования значения varchar "№ 52/1-697" в тип данных int.
Это значение содержится в VInformation.ObjectInfo и если выполнить запрос VInformation отдельно, никаких ошибок нет.

Не возникает ошибки если написать так:
SELECT        dbo.Object.ObjectID, COALESCE (dbo.VInformation.ObjectInfo, NULL) AS Expr1
FROM            dbo.Object LEFT OUTER JOIN
                         dbo.VInformation ON dbo.Object.ObjectID = dbo.VInformation.ObjectID LEFT OUTER JOIN
                         dbo.VLawQualify ON dbo.Object.ObjectID = dbo.VLawQualify.ObjectID
31 авг 18, 13:04    [21660148]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Страдалецъ,

типы будете в секрете держать?
31 авг 18, 13:18    [21660180]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
invm
Member

Откуда: Москва
Сообщений: 9350
Страдалецъ,

Помедитируйте над результатом запроса
select
 sql_variant_property((select top (1) ObjectInfo from dbo.VInformation), 'BaseType'),
 sql_variant_property((select top (1) ObjectInfo from dbo.VLawQualify), 'BaseType')
31 авг 18, 13:23    [21660184]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Страдалецъ,

SELECT        dbo.Object.ObjectID, COALESCE (dbo.VInformation.ObjectInfo, cast(dbo.VLawQualify.ObjectInfo as Varchar(100))) AS Expr1
FROM            dbo.Object LEFT OUTER JOIN
                         dbo.VInformation ON dbo.Object.ObjectID = dbo.VInformation.ObjectID LEFT OUTER JOIN
                         dbo.VLawQualify ON dbo.Object.ObjectID = dbo.VLawQualify.ObjectID
31 авг 18, 13:24    [21660186]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
Страдалецъ,

Error Message: Ошибка преобразования значения varchar "№ 52/1-697" в тип данных int.

Какому числу соответствует "№ 52/1-697"?
31 авг 18, 13:49    [21660217]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
Страдалецъ
Не возникает ошибки если написать так:
Так сделайте конверт:
COALESCE (convert(varchar(100), dbo.VLawQualify.ObjectInfo), convert(varchar(100), dbo.VInformation.ObjectInfo)) AS Expr1 
31 авг 18, 14:08    [21660239]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Wlr-l
Member

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

О каком конверте идет речь, если в первом же посте ТС написано: "Возможно что происходит попытка вычислить текстовое значение '5/10-А', на котором собственно и вылетает ошибка"?

И сообщение об ошибке он уже привел :"Error Message: Ошибка преобразования значения varchar "№ 52/1-697" в тип данных int"
31 авг 18, 14:12    [21660246]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1415
invm,
Помедитировал, как и ожидалось имеем varchar и null. Сделал запрос:

select
(select top (1) ObjectInfo from dbo.VInformation),
 (select top (1) ObjectInfo from dbo.VLawQualify)

Получил ту-же ошибку.

 select
 coalesce((select top (1) cast(ObjectInfo as varchar(150)) from dbo.VInformation),(select top (1) ObjectInfo from dbo.VLawQualify))

Получил ту-же ошибку.

Сделал запрос по значениям возвращающимся из запроса:
 select
 coalesce('№ 52/1-697',null)

Получил ожидаемый '№ 52/1-697'

Все это я уже проверил в разных вариантах. Понимания, как победить проблему не добавило.
31 авг 18, 14:13    [21660249]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
Страдалецъ,

Вы все еще не понимаете, что делаете.
31 авг 18, 14:18    [21660259]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Страдалецъ,

да скажи ты типы полей уже, медитатор

автор
Вы все еще не понимаете, что делаете.

вы тоже
31 авг 18, 14:23    [21660268]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Wlr-l
Member

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

Как мы уже поняли, разные и автоматически не конвертируются один в другой.
31 авг 18, 14:29    [21660279]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Wlr-l
TaPaK,

Как мы уже поняли, разные и автоматически не конвертируются один в другой.

вы же там что-то расчитываете, не отвлекайтесь


тс. Ошибка это ака

;WITH x(a,b) AS 
(
	SELECT	1	, NULL 
	UNION 
	SELECT	NULL	, '№ 52/1-697'
)
SELECT COALESCE (a,b) FROM x
31 авг 18, 14:32    [21660283]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
msLex
Member

Откуда:
Сообщений: 8091
Страдалецъ
invm,
Помедитировал, как и ожидалось имеем varchar и null. Сделал запрос:

select
(select top (1) ObjectInfo from dbo.VInformation),
 (select top (1) ObjectInfo from dbo.VLawQualify)


Получил ту-же ошибку.


У вас dbo.VInformation и/или dbo.VLawQualify это view, видимо.

Вот они криво и написаны.
31 авг 18, 14:33    [21660286]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Wlr-l
Member

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

"Вот они криво и написаны."

Не факт. Скорее всего криво используются.
31 авг 18, 14:38    [21660288]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
msLex
Member

Откуда:
Сообщений: 8091
Wlr-l
Не факт. Скорее всего криво используются.

Если select top 1 * from view падает с ошибкой, то проблема явно не в использовании
31 авг 18, 14:48    [21660304]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка преобразования varchar в int  [new]
Wlr-l
Member

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

В самом первом ответе красиво сказано: "жените атрибуты разных типов данных".

Дело не в top, а в coalesce:

coalesce((select top (1) cast(ObjectInfo as varchar(150)) from dbo.VInformation),(select top (1) ObjectInfo from dbo.VLawQualify))


Т.е. имеем несовместимые типы данных и пытаемся всем миром привести их к одному.

TaPaK уже смоделировал эту ситуацию.
31 авг 18, 14:56    [21660321]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить