2009-07-20 61 views
31

が、私は別のテーブルから値を挿入しようとしているテーブルの定義と一致していません。列名または指定された値の数は、以下のクエリを使用して、SQL Serverで

が助けてください:

Column name or number of supplied values does not match table definition. 

は、私は両方のテーブルが同じ構造、列名と同じデータ型を持つことを確信しています!あなたが望むことは何

+1

もう1つの可能性は、 TEMP DBと挿入するDBが一致しません。 –

答えて

26

彼らは同じ構造を持っていない...私は、彼らが異なる

ある保証することができ、私はあなたがすでにそれを作成して知っている... There is already an object named ‘tbltable1’ in the database

が、これも(これはあなたの他の問題)が修正されます。列名を指定することは常に良いです挿入用

Drop table tblTable1 

select * into tblTable1 from tblTable1_Link 
14

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX) 
) 

INSERT INTO @Table SELECT '1' 
以下を参照してください

デフエラー

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX), 
     Val2 VARCHAR(MAX) 
) 

INSERT INTO @Table SELECT '1' 

Msg 213, Level 16, State 1, Line 6 Insert Error: Column name or number of supplied values does not match table definition.

しかし

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX), 
     Val2 VARCHAR(MAX) 
) 

INSERT INTO @Table (Val1) SELECT '1' 

作品に上記の変更が発生するために、テーブルを変更し、正常に動作します。あなたは、構造体を提供する列が

を指定して、より具体的である必要があり、我々は見て

2

の小さな変更を加える必要が来ている理由私が見つけた私も

ノースウエストこのエラーを解決するために働いていた

は私のためのオプションではありませんでした、私は実行中のログを保持しているからです。私が挿入する必要があるたびに落ちなければならないと、テーブルは無意味になります。

私のエラーは、これらの固定問題を変更して、他の列の製品であるcreate tableステートメントに2つの列があったためです。例えば

create table foo (
field1 as int 
,field2 as int 
,field12 as field1 + field2) 

create table copyOfFoo (
field1 as int 
,field2 as int 
,field12 as field1 + field2) --this is the problem, should just be 'as int' 

insert into copyOfFoo 
SELECT * FROM foo 
10

これは古い記事ですが、私はあなたが

insert into blah 
     select * from blah2 

のようなものを持っているし、何とかしてblah2場合、計算カラムは、この同じエラーがスローされますことを心に留めて、同一キープしていることにも言及したいと思います...

は、私はちょうど上の障害が発生したと私は私の例では

insert into blah (cola, colb, colc) 
     select cola, colb, colc from blah2 

をしようとしたとき、それは計算列が問題を作る

1

(最初と最後から計算、など)フルネームフィールドがあったことに気づきました。 SELECT *は使用しないでください。計算後のフィールドを除いてSELECTの後に各フィールドを指定する必要があります

0

良い解決策を見つけたら幸いです。 私は同じ問題を抱えていました。私はその問題を回避する方法はおそらく最高ではありませんが、現在は機能しています。

これは、リンクされたサーバーを作成し、動的SQLを使用することです - 最高ではありませんが、誰かが何か良いことを提案できる場合は、コメント/回答してください。

declare @sql nvarchar(max) 


DECLARE @DB_SPACE TABLE (
[DatabaseName] NVARCHAR(128) NOT NULL, 
[FILEID] [smallint] NOT NULL, 
[FILE_SIZE_MB] INT NOT NULL DEFAULT (0), 
[SPACE_USED_MB] INT NULL DEFAULT (0), 
[FREE_SPACE_MB] INT NULL DEFAULT (0), 
[LOGICALNAME] SYSNAME NOT NULL, 
[DRIVE] NCHAR(1) NOT NULL, 
[FILENAME] NVARCHAR(260) NOT NULL, 
[FILE_TYPE] NVARCHAR(260) NOT NULL, 
[THE_AUTOGROWTH_IN_KB] INT NOT NULL DEFAULT(0) 
,filegroup VARCHAR(128) 
,maxsize VARCHAR(25) 

PRIMARY KEY CLUSTERED ([DatabaseName] ,[FILEID]) 
) 


SELECT @SQL ='SELECT [DatabaseName], 
     [FILEID], 
     [FILE_SIZE_MB], 
     [SPACE_USED_MB], 
     [FREE_SPACE_MB], 
     [LOGICALNAME], 
     [DRIVE], 
     [FILENAME], 
     [FILE_TYPE], 
     [THE_AUTOGROWTH_IN_KB] 
     ,filegroup 
     ,maxsize FROM OPENQUERY('+ QUOTENAME('THE_MONITOR') + ','''+ ' EXEC MASTER.DBO.monitoring_database_details ' +''')' 
exec sp_executesql @sql 


     INSERT INTO @DB_SPACE(
          [DatabaseName], 
          [FILEID], 
          [FILE_SIZE_MB], 
          [SPACE_USED_MB], 
          [FREE_SPACE_MB], 
          [LOGICALNAME], 
          [DRIVE], 
          [FILENAME], 
          [FILE_TYPE], 
          THE_AUTOGROWTH_IN_KB, 
          [filegroup], 
          maxsize 
         ) 

     EXEC SP_EXECUTESQL @SQL 

これは私のために今働いています。 ストアドプロシージャから返される列の数と型は、ストアドプロシージャから同じテーブルを返すだけなので、このテーブルと同じです。

おかげに関して マルセロ

8

問題は、あなたが列を使用せずにデータベースにデータを挿入しようとしているということです。 SQL Serverはそのエラーメッセージを表示します。

エラー:insert into users values('1', '2','3') - これは限り、あなたは4列を持っているだけで、それらの3

正しいに挿入したい場合は、わずか3列

を持って正常に動作します:このことができますinsert into users (firstName,lastName,city) values ('Tom', 'Jones', 'Miami')

希望を

0

は私にとって犯人は、EMPに給与

挿入に割り当てられたint型の値であり、給与欄のloyees(ID、姓、姓、性別、給与)の値(3、 'カナダ'、 'PA'、 'M'、15000)

我々はコンパイラ15,000を割り当てる15と000

を理解します

この修正は私のためにうまくいきます。 従業員(ID、姓、性別、給与)の値(4、 '米国'、 'サム'、 'm'、15000)

0

IDを確認してくださいIDはNULLではありませんID(1,1) テーブルを作成してテーブルを作成してからテーブルを作成する前に 2日後に私はこの問題を解決しました..

関連する問題