2017-07-06 9 views
2

SQL Serverに問題があります。varchar値 '0%'をデータ型intに変換するときに変換に失敗しました

私はこのようなテーブル作成しました:私は次のエラーを取得する

insert into Components (id, descr, in_m, in_iy, p_fw) 
values ('FW000_A', '0%', 0, 0, '[0.0,0.0,0.0]'), 
     ('FW000_B', '1%', 1, 1, '[1.0,1.0,1.0]'); 

Msg 245, Level 16, State 1, Line 111
Conversion failed when converting the varchar value '0%' to data type int.

create table Components 
(
    pk BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    id VARCHAR(50), 
    descr VARCHAR(50), 
    in_m INT, 
    in_iy INT, 
    p_fw VARCHAR(5000) 
); 

を、私は値のカップルを挿入しようとしていますたとえ列descrvarchar(50)と正しく定義されていても、

となります。

誰でも助けてくれますか?なぜSQL Serverは文字列をint値に変換しようとしていますか?

+1

あなたのコードは、SQL Server 2014で動作します。http://rextester.com/UOOT87695作成したテーブルと同じですか?同じスキーマなど? –

+0

私はSQL Server Express 2012を使用していますが、はい、私は "use mydb;"ファイルの先頭にある文です。編集:私は表記[スキーマ]を追加しようとしました。[テーブル]作成と挿入の両方のクエリが、私は前と同じ結果を取得しています... – jjhorn

+0

SQLトレースを実行するか、https:// hibernatingrhinos.com/products/nhprof)実際のSQLは電線のどこに渡されますか? – mjwills

答えて

2

であるように、あなたが示してきたわずか2 valuesライン以上のものを持っていることであり、他のものの一つは、整数を持っている、あなたの質問から何が不足しているかに見えます文字列ではなくdescr列のリテラルです。私は信じて何が起こる

declare @t table (Descr varchar(50) not null) 
insert into @t(Descr) values 
('0%'), 
(12) 

は、SQL Serverが最初values句のすべての列のデータ型を決定しようとすることです:

この例では、同じエラーを生成します。データ型の優先順位規則を使用すると、ある行のリテラルvarcharともう一方のリテラルのintが観察され、この列の全体の型がintであると判断され、エラーにつながる変換を実行しようとします。

ではないは、valuesが配置されるターゲットテーブルに関するすべての情報(そこの列のデータ型を含む)を使用します。

+0

あなたは絶対に正しいです! !! 2番目の列には、約436番目の挿入されたタプルで引用符を付けずに値 '100'がありました。おそらく、私のSQL自動コード生成器のバグですが、この重要な概念を覚えました。列のデータ型を含め、値が配置されるターゲットテーブルに関する情報は使用しません。皆様のご支援のおかげで、問題は解決しました! – jjhorn

1

これを実行してデータ型を確認します。

sp_columns Components 

「DESCRは本当に整数

+0

驚くほど 'descr'はvarchar(50)です... – jjhorn

関連する問題