У меня есть таблица MS SQL McTable со столбцом BigMacs nvarchar (255). Я хотел бы получить строки со значением BigMacs больше 5.
Что я делаю:
select * from
(
select
BigMacs BigMacsS,
CAST(BigMacs as Binary) BigMacsB,
CAST(BigMacs as int) BigMacsL
from
McTable
where
BigMacs Like '%[0-9]%'
) table
where
Cast(table.BigMacsL as int) > 5
И в результате я получаю ошибку:
Состояние 1, строка 67 Преобразование не выполнено
при преобразовании значения nvarchar
"***" для
тип данных int.
Но когда я удаляю последний фильтр where Cast(table.BigMacsL as int) > 5
, он работает, и я получаю такой результат:
6 0x360000000000000000000000000000000000000000000000000000000000 6
23 0x320033000000000000000000000000000000000000000000000000000000 23
22 0x320032000000000000000000000000000000000000000000000000000000 22
24 0x320034000000000000000000000000000000000000000000000000000000 24
25 0x320035000000000000000000000000000000000000000000000000000000 25
3 0x330000000000000000000000000000000000000000000000000000000000 3
17 0x310037000000000000000000000000000000000000000000000000000000 17
17 0x310037000000000000000000000000000000000000000000000000000000 17
19 0x310039000000000000000000000000000000000000000000000000000000 19
20 0x320030000000000000000000000000000000000000000000000000000000 20
659 0x360035003900000000000000000000000000000000000000000000000000 659
1 0x310000000000000000000000000000000000000000000000000000000000 1
43 0x340033000000000000000000000000000000000000000000000000000000 43
44 0x340034000000000000000000000000000000000000000000000000000000 44
45 0x340035000000000000000000000000000000000000000000000000000000 45
46 0x340036000000000000000000000000000000000000000000000000000000 46
47 0x340037000000000000000000000000000000000000000000000000000000 47
44 0x340034000000000000000000000000000000000000000000000000000000 44
44 0x340034000000000000000000000000000000000000000000000000000000 44
47 0x340037000000000000000000000000000000000000000000000000000000 47
43 0x340033000000000000000000000000000000000000000000000000000000 43
50 0x350030000000000000000000000000000000000000000000000000000000 50
44 0x340034000000000000000000000000000000000000000000000000000000 44
И когда я изменяю в первом запросе «select * from» на «select top 18 * from», я тоже не получаю ошибку!
Я не знаю, в чем проблема и как заставить это работать! Не могли бы вы помочь мне?
Еще раз: здесь я пытаюсь получить строки McTable со значением BigMacs больше 5.
UPDATE
Действия по воспроизведению этой ошибки:
Я подготовил запросы, чтобы вы могли легко получить эту ошибку в своей базе данных:
Создать базу данных TestDB, создать таблицу с:
USE [TestDB]
GO
/****** Object: Table [dbo].[TestTable] Script Date: 04/08/2009 16:27:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TestTable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[MyVal] [nvarchar](255) COLLATE Polish_CI_AS NOT NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
вставить значения с помощью:
delete from TestDB.dbo.TestTable
insert into TestDB.dbo.TestTable (MyVal) values ('fd')
insert into TestDB.dbo.TestTable (MyVal) values ('54543534')
insert into TestDB.dbo.TestTable (MyVal) values ('fat3tv3gv5')
insert into TestDB.dbo.TestTable (MyVal) values ('fdf4v43 4v434v')
insert into TestDB.dbo.TestTable (MyVal) values (' g dfg dfg df')
insert into TestDB.dbo.TestTable (MyVal) values ('f sd 4t4gsdf')
insert into TestDB.dbo.TestTable (MyVal) values ('f df 4 trwefg')
insert into TestDB.dbo.TestTable (MyVal) values ('f sd f4 fgsfg sd')
insert into TestDB.dbo.TestTable (MyVal) values ('54534534')
insert into TestDB.dbo.TestTable (MyVal) values ('454')
Этот запрос:
select
CAST(MyVal as int) MyValInt
from
dbo.TestTable
where
IsNumeric(MyVal) = 1
приводит к действительным числам, как показано ниже:
54543534
54534534
454
И при попытке получить отфильтрованные значения с помощью этого запроса:
select
*
from
(
select
CAST(MyVal as int) MyValInt
from
dbo.TestTable
where
IsNumeric(MyVal) = 1
) tabela
where
tabela.MyValInt > 6
Вы должны получить эту ошибку, которая не должна возникать:
Сообщение 245, Уровень 16, Состояние 1, Строка 1
Ошибка преобразования при преобразовании значения nvarchar 'fd' в тип данных int.