カラム名または指定された値の数がテーブル定義と一致しない

SQLサーバーでは、以下のクエリを使用して、あるテーブルから別のテーブルに値を挿入しようとしています。

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

次のようなエラーが発生しています。

列名または供給された値の数がテーブル定義と一致しません。

どちらのテーブルも同じ構造、同じ列名、同じデータ型であることは確認しています。

よろしくお願いします。

質問へのコメント (2)
ソリューション

同じ構造ではありません...。違っていると断言できます

もう作ったんでしょうが...。データベースには、すでに「tbltable1」という名前のオブジェクトがあります

あなたが欲しいのはこれかもしれません(あなたの別の問題も解決されます)。

Drop table tblTable1

select * into tblTable1 from tblTable1_Link
解説 (0)

挿入の際には、常にカラム名を指定した方が良いでしょう、以下を参照してください。

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, レベル16, 状態1, 行6

挿入エラーです。列名または列数の 与えられた値がテーブルの定義と一致しません。 定義と一致していません。

しかし、上記のように変更すると

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

INSERT INTO @Table (Val1)  SELECT '1'

に変更すると動作します。もっと具体的に列を指定する必要があります。

構造体を提供していただければ、私たちが見てみましょう。

解説 (0)

これは古い投稿ですが、何かあったらそのことも触れておきたいと思います。

insert into blah
       select * from blah2

計算された列はこれと同じエラーをスローすることを覚えておいてください。..

上記が失敗して試したことに気づきました。

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

私の例では、フルネームフィールドでした(最初と最後から計算など)。

解説 (1)

問題は、列を使用せずにデータベースにデータを挿入しようとしていることです。 Sqlサーバーはそのエラーメッセージを提供します。

エラー: ユーザーの値に挿入( '1'、 '2'、 '3')-これは、列が3つしかない場合に正常に機能します。

4列あるが、そのうちの3列にのみ挿入したい場合。

正しい: ユーザー(firstName、lastName、city)値( 'Tom'、 'Jones'、 'Miami')に挿入します。

これが役立つことを願っています。

解説 (0)

ランニングログを維持しているため、テーブルを落とすことは選択肢ではありませんでした。 挿入する必要があるたびにドロップする必要がある場合、テーブルは無意味になります。

私のエラーは、他の列の製品である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
解説 (0)

IDがIDであることを確認します。IDである場合は、IDがnullではないことを確認してくださいIdentity(1,1)。 テーブルを作成する前に、テーブルをドロップしてからテーブルを作成します。. 2日後、私はこの問題を解決しました。.

解説 (0)

SQLサーバー2016/2017 / ...に更新。 データベースをインポートおよびエクスポートするためのいくつかの手順を保存しています。 spでは、(とりわけ)RESTORE FILELISTONLY FROM DISKを使用して、aを作成します。 ファイルからの復元用のテーブル「#restoretemp」。

SQLサーバー2016では、MSがフィールド SnapshotURL nvarchar(360)(rl Azureを復元)を追加し、エラーメッセージの原因を突き止めました。 追加フィールドを強化した後、復元が再び機能しました。 コードが切り取られました(最後のフィールドを参照):

 SET @query = 'RESTORE FILELISTONLY FROM DISK = ' + QUOTENAME(@BackupFile , '''')
CREATE TABLE #restoretemp
(
LogicalName nvarchar(128)
,PhysicalName nvarchar(128)
,[Type] char(1)
,FileGroupName nvarchar(128)
,[Size] numeric(20,0)
,[MaxSize] numeric(20,0)
,FileID bigint
,CreateLSN numeric(25,0)
,DropLSN numeric(25,0) NULL
,UniqueID uniqueidentifier
,ReadOnlyLSN numeric(25,0)
,ReadWriteLSN numeric(25,0)
,BackupSizeInByte bigint
,SourceBlockSize int
,FilegroupID int
,LogGroupGUID uniqueidentifier NULL
,DifferentialBaseLSN numeric(25,0)
,DifferentialbaseGUID uniqueidentifier
,IsReadOnly bit
,IsPresent bit
,TDEThumbprint varbinary(32)
-- Added field 01.10.2018 needed from SQL Server 2016 (Azure URL)
,SnapshotURL nvarchar(360)
)

INSERT #restoretemp EXEC (@query)
SET @errorstat = @@ERROR
if @errorstat  0 
Begin
if @Rueckgabe = 0 SET @Rueckgabe = 6
End
Print @Rueckgabe
解説 (1)

トリガーに注意してください。 多分問題は挿入された行のトリガーにある程度の操作にあります。

解説 (0)

カラムのプレフィックスが、クエリで使用されているテーブル名やエイリアス名と一致しない。

また、このエラーを解決するために

原因がわかりました。ただ、クエリを少し変更する必要があります。

http://sqlerrormessages.blogspot.com/2009/08/sql-server-error-messages-msg-107.html

解説 (0)

計算された列が問題を引き起こします。 「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

これは今私のために働いています。 保存された手順から同じテーブルを返すという理由だけで、保存された手順によって返される列の数と列のタイプがこのテーブルと同じであることを保証できます。

よろしくお願いします。 マルセロ。

解説 (0)

私にとって、犯人は給与に割り当てられたint値です。

従業員(ID、FirstName、LastName、Gender、Salary)の値(3、「Canada」、「pa」、「m」、15,000)に挿入します。

給与列15,000を割り当てると、コンパイラは15と000を理解します。

この修正は私には問題ありません。 従業員(ID、FirstName、LastName、Gender、Salary)の値(4、 'US'、 'sam'、 'm'、15000)に挿入します。

解説 (0)