powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Error converting data type nvarchar to bigint
4 сообщений из 4, страница 1 из 1
Error converting data type nvarchar to bigint
    #39930372
maldalik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла такая проблема:
есть таблица с ip адресами, поле типа varchar(50)
пытаюсь конвертировать IP в бигинт
select dbo.inet_aton(ltrim(rtrim(ip)))
from mda_obor
и получаю ошибку Error converting data type nvarchar to bigint ...
Дело не в грязных данных, потому что это срабатывает даже для первой записи
и полей nvarchar у меня не используется совсем..
Если скопировать этот IP и напрямую подставить в запрос то все ок.
Mssql 2008 r2

Функция тоже простая:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
ALTER FUNCTION [dbo].[inet_aton] 
(
   @ip varchar(15) 
)
RETURNS bigint
AS
BEGIN
declare @ip_new bigint
--	RETURN
select @ip=
	(
		CAST(PARSENAME(@ip, 1) as bigint) * 16777216 +
		CAST(PARSENAME(@ip, 2) as bigint) * 65536 +
		CAST(PARSENAME(@ip, 3) as bigint) * 256 +
		CAST(PARSENAME(@ip, 4) as bigint)
	)
select @ip_new = @ip
if @ip > 2147483648
	begin
		select @ip_new=@ip-4294967296
	end
return @ip_new
--RETURN @ip
END
...
Рейтинг: 0 / 0
Error converting data type nvarchar to bigint
    #39930376
maldalik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно удалять, затесались невидимые спецсимволы, удали все норм.
правда при чем ту nvarchar все равно не понял
...
Рейтинг: 0 / 0
Error converting data type nvarchar to bigint
    #39930377
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maldalik
правда при чем ту nvarchar все равно не понял
Потому что функция PARSENAME возвращает nvarchar
Код: sql
1.
2.
3.
4.
select CAST(PARSENAME('asdf', 1) as bigint)

Msg 8114, Level 16, State 5, Line 44
Error converting data type nvarchar to bigint.



Соответственно, нужно писать
Код: sql
1.
2.
3.
4.
5.
6.
7.
select @ip=
	(
		TRY_CAST(PARSENAME(@ip, 1) as bigint) * 16777216 +
		TRY_CAST(PARSENAME(@ip, 2) as bigint) * 65536 +
		TRY_CAST(PARSENAME(@ip, 3) as bigint) * 256 +
		TRY_CAST(PARSENAME(@ip, 4) as bigint)
	)

У вас, правда, 2008R2, там нужно по другому
...
Рейтинг: 0 / 0
Error converting data type nvarchar to bigint
    #39930379
Guf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maldalik,

Проблема именно в грязных данных, потому что функция PARSENAME возвращает результат типа nvarchar. И этот результат не может быть быть преобразован в bigint.
авторпотому что это срабатывает даже для первой записи
Не существует никакой первой записи. SQL декларативный язык, мы говорим серверу, что мы хотим получить на выходе, как этого добиться сервер решает сам.
В случае запроса
Код: sql
1.
2.
3.
select dbo.inet_aton(ltrim(rtrim(ip)))
from mda_obor
where "первая запись"

Сервер вполне может решить выполнить преобразование для всей таблицы, а потом показать только "первую запись", что бы это не значило...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
ALTER FUNCTION [dbo].[inet_aton] 
(
   @ip varchar(15) 
)
RETURNS bigint
AS
BEGIN
declare @ip_new bigint
--	RETURN
select @ip= -- Тут потенциальная ошибка. Присвоение строке числа без явного преобразования
	(
		CAST(PARSENAME(@ip, 1) as bigint) * 16777216 +
		CAST(PARSENAME(@ip, 2) as bigint) * 65536 +
		CAST(PARSENAME(@ip, 3) as bigint) * 256 +
		CAST(PARSENAME(@ip, 4) as bigint)
	)
select @ip_new = @ip -- Тут потенциальная ошибка. Присвоение числу строки без явного преобразования
if @ip > 2147483648 -- Тут потенциальная ошибка. Сравнение числа и строки без явного преобразования
	begin
		select @ip_new=@ip-4294967296 -- Ваще бред! Число = строка - число.
	end
return @ip_new
--RETURN @ip
END
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Error converting data type nvarchar to bigint
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]