我有一个带有 BigMacs nvarchar(255) 列的 MS SQL 表 McTable。我想获得 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
结果我得到一个错误:
将 nvarchar 值“***”转换为数据类型 int 时,状态 1,第 67 行转换失败。
但是当我删除最后一个过滤器where Cast(table.BigMacsL as int) > 5
时,它可以工作,我得到了这个结果:
6 0x36000000000000000000000000000000000000000000000000000000000000 6 23 0x3200330000000000000000000000000000000000000000000000000000000 23 22 0x320032000000000000000000000000000000000000000000000000000000 22 24 0x3200340000000000000000000000000000000000000000000000000000000 24 25 0x3200350000000000000000000000000000000000000000000000000000000 25 3 0x33000000000000000000000000000000000000000000000000000000000000 3 17 0x3100370000000000000000000000000000000000000000000000000000000 17 17 0x3100370000000000000000000000000000000000000000000000000000000 17 19 0x310039000000000000000000000000000000000000000000000000000000 19 20 0x32003000000000000000000000000000000000000000000000000000000000 20 659 0x360035003900000000000000000000000000000000000000000000000000 659 1 0x31000000000000000000000000000000000000000000000000000000000000 1 43 0x3400330000000000000000000000000000000000000000000000000000000 43 44 0x3400340000000000000000000000000000000000000000000000000000000 44 45 0x3400350000000000000000000000000000000000000000000000000000000 45 46 0x3400360000000000000000000000000000000000000000000000000000000 46 47 0x340037000000000000000000000000000000000000000000000000000000 47 44 0x3400340000000000000000000000000000000000000000000000000000000 44 44 0x3400340000000000000000000000000000000000000000000000000000000 44 47 0x340037000000000000000000000000000000000000000000000000000000 47 43 0x3400330000000000000000000000000000000000000000000000000000000 43 50 0x3500300000000000000000000000000000000000000000000000000000000 50 44 0x3400340000000000000000000000000000000000000000000000000000000 44
当我将第一个查询“select * from”更改为“select top 18 * from”时,我也没有收到错误!
我不知道是什么问题以及如何使它工作!请你帮助我好吗?
再一次:我在这里尝试完成的是让这些具有 BigMacs 值大于 5 的 McTable 行。
更新
重现此错误的步骤:
我已经准备好查询,因此您可以轻松地在数据库上收到此错误:
创建数据库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 时转换失败。