2017-10-10 20 views
0

過去にこの問題に対処する多数の質問があり、なぜこのエラーが発生するのか理解しています。SQL Server - "提供された値の列名または数値がテーブル定義と一致しません"

私は実際にショートカットを実行しています。テーブルには数百の列があり、フィールド定義に対して値をチェックするコードを手動で調べる必要はありません。それを実行しようとすると、エラーメッセージは常に同じ行番号を指しています - それにINSERTを付けた行。

実際のフィールドを指すようにする簡単な方法がありますか?それとも問題がありますか?

編集:与えられた答えを読んだ後、私はこのメッセージの原因を全く理解していないことに気付きました。それはまさにフィールドの欠落の結果であり、間違ったデータタイプにはまったく関係していませんでした。欠落したフィールドを追加すると、データ型がまだいくつかのフィールドで間違っていても、エラーは消えてしまいました。

幸いなことに、回答とコメントは私の評価ではなく、問題の実際の原因を理解していたため、問題は解決されました。

+0

SQL Server Management StudioのIntellisenseは無効な列名を強調表示します –

+0

これは完全にINSERT文が何であるかによって異なります。あなたがそれをあなたの質問に追加すれば助けます*ヒントヒントnudge nudge * – Shaneis

+0

@JamiePollard私はそれに2つの問題があります.1)intellisenseはリンクサーバーなのですべてを強調しています.2)フィールド名は大丈夫です)私は(ほとんど)間違ったデータ型をフィールドに入れています。 – Lefty

答えて

2

の問題が実際のフィールドを指すようにする簡単な方法はありますか?

もちろんです。それはプログラマーの実際のインテントの直感的な理解を必要とし、そのコンピューターの現在の能力はありません。

あなたは次のように挿入部を持っている:多分プログラマはそのように望んでいたので、コンピュータは、ColumnBはValueC VALUEBを取得してはならないことを知っている可能性が方法はありません

INSERT INTO MyTable (ColumnA, ColumnB, ... ColumnZ) 
VALUES (ValueA, ValueC, ... ValueZ) 

。したがって、ValueBが欠落しているか、ColumnBが「問題の列」であることをプログラムで知る方法はありません。

いいえ、ショートカットはありません。申し訳ありません。これは、表現を注文

insert into t(col1, 
       col2, 
       . . . 
      ) 
    values (<whatever>, -- col1 
      <whatever>, -- col2 
      . . . 
      ); 

:としてあなたが行うことができます

+0

私はあなたが言っていることを理解していますが、 "AccountBalance"という数値フィールドに "abc"をロードしようとすると、明らかにトリップしています。なぜ、 "AccountBalance"失敗...? – Lefty

+0

Tabが既に述べたように、SQLエンジンはその問題をどのように知ることができましたか?データ型が一致しない場合、暗黙の変換が行われます。もしそれが起こったたびに手を捨てれば、コードの作成者はそれが起こることを望んでいるときには挑戦的になるだろう。 –

+0

パーサーは、エラーのある場所を直接指し示さない場合がありますが、通常は、指し示されていたところでエラーが閉じています。 17行目は実際には13行目のときにパーサがエラーを指摘する場所です。しかし、あなたのケースでは、それは1つの大きな文字列であるためおそらく難しいでしょう。 – Edper

2

ことの一つは、insertを構築することです。 2つのリストをスプレッドシートに貼り付け、手動で比較することで問題を見つけることができます。単にあなたの問題を解決することがあり、挿入された列をリストもちろん​​

insert into t(col1, 
       col2, 
       . . . 
      ) 
    select <whatever> as col1, 
      <whatever> as col2 
      . . . 

、:

それとも、私がやる可能性が高いんだと。

次に、私はあなたのテーブルを再訪することをお勧めします。そのような挿入物を取っているテーブルに何百もの列を持つことは悪い考えかもしれません。テーブルを構造化するより良い方法があるかもしれません。

不思議なことに、MySQLには興味深い、非標準的な解決策があります。 にsetを含めることができるので、明示的に列の値を設定できます。

+0

このクエリは非常に大きく、動作方法を変更することができません。また、非常に多くのカラムがある理由は非常にあります。 SELECT INTOを使用してテーブルに出力を書き込んでいましたが、これはうまくいきました。カラムの一部が異なるようにほぼ同じテーブルに書き込むように変更したいだけです。テーブルを再設計したり、クエリを書き換えたりすることはできません。 – Lefty

1

これはSQLソリューションではありません。しかし、おそらくフィールドを値にマップするための小さなプログラムを作成し、そこから何が問題なのかを判断します。

JavaScriptの私の簡単なプログラムがmap-field-to-valuesであることを確認してください。

+0

私はこれが好きです!あなたの答えをありがとう! – Lefty

+0

@Leftyようこそ。しかし、あなたの 'SQL'コマンド文字列を私のプログラムに入れて実行しようとしましたか?それを試しておかないと、それがうまく動作するかどうか、あるいは 'SQL'コマンドの文字列を** Google docs **に投稿して、後でそのリンクを共有することもできます。 – Edper

+0

いいえ私はあなたがこれを投稿した時点で問題を "手動で"解決することができたので、まだ試していませんでしたが、私はある時点でそれを試してみるでしょう。私は本当にSQLを「パブリックドメイン」に入れることはできません。なぜなら、それは私の会社の財産であり、残念ながらそれを十分に難読化するには時間がかかりすぎるからです。 – Lefty

関連する問題