BigMacs nvarchar(255)列を持つMSSQLテーブル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
その結果、エラーが発生します。
状態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 0x31000000000000000000000000000000000000000000000000000000000000 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'から'selecttop 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に変換するときに、変換に失敗しました。