programing

열 이름 또는 제공된 값 수가 테이블 정의와 일치하지 않습니다.

newstyles 2023. 7. 3. 22:36

열 이름 또는 제공된 값 수가 테이블 정의와 일치하지 않습니다.

SQL Server에서 아래 쿼리를 사용하여 한 테이블에서 다른 테이블로 값을 삽입하려고 합니다.

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

다음 오류가 발생합니다.

열 이름 또는 제공된 값 수가 테이블 정의와 일치하지 않습니다.

두 테이블 모두 구조가 같고 열 이름이 같고 데이터 유형이 같습니다.

그들은 같은 구조를 가지고 있지 않습니다...나는 그들이 다르다는 것을 보증할 수 있습니다.

당신이 이미 만든 거 알아요...데이터베이스에 'tbltable1'이라는 개체가 이미 있습니다.

원하는 것은 다음과 같습니다(다른 문제도 해결됩니다).

Drop table tblTable1

select * into tblTable1 from tblTable1_Link

저는 또한 만약 당신이 그런 것을 가지고 있다면 언급하고 싶습니다.

insert into blah
       select * from blah2

그리고 blah와 blah2는 동일합니다. 계산된 열이 동일한 오류를 던질 것입니다.

위의 것들이 실패했을 때, 그리고 제가 노력했을 때,

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

내 예에서는 전체 이름 필드(첫 번째와 마지막 등에서 계산됨)였습니다.

삽입물의 경우 항상 열 이름을 지정하는 것이 좋습니다. 다음을 참조하십시오.

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'

Msg213, 레벨 16, 상태 1, 라인 6 삽입 오류: 열 이름 또는 제공된 값 수가 테이블 정의와 일치하지 않습니다.

그러나 위의 내용을 변경하는 것은

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

INSERT INTO @Table (Val1)  SELECT '1'

작동합니다. 지정된 열을 더 구체적으로 지정해야 합니다.

구조물을 제공하면 우리는 볼 수 있습니다.

문제는 열을 사용하지 않고 데이터베이스에 데이터를 삽입하려고 한다는 것입니다. SQL 서버에서 오류 메시지를 표시합니다.

오류:insert into users values('1', '2','3')만 있으면 됩니다.

4개의 열이 있지만 그 중 3개에만 삽입하려는 경우

정답:insert into users (firstName,lastName,city) values ('Tom', 'Jones', 'Miami')

방아쇠를 조심하세요.삽입된 행에 대한 트리거의 일부 작업에 문제가 있을 수 있습니다.

저는 실행 일지를 작성하고 있기 때문에 테이블을 떨어뜨리는 것은 제게 선택사항이 아니었습니다.삽입할 때마다 떨어져야 한다면 테이블은 무의미할 것입니다.

테이블 만들기 문에 다른 열의 제품인 열이 몇 개 있어서 문제가 해결되었습니다.예를 들어

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

계산된 열이 문제가 됩니다.을 사용하지 .SELECT *된 필드를 한 각 뒤에 .

이 문제에 대한 일부 출처는 아래와 같습니다.

1 - ID 열,

2 - 계산된 열

3가지 구조

그래서 그 3개를 확인해보세요, 저는 제 문제가 두 번째 문제라는 것을 발견했습니다.

나에게 범인은 급여에 할당된 가치가 있습니다.

직원(ID, 이름, 성, 성별, 급여) 값에 삽입(3, '캐나다', '파', 'm', 15,000)

급여 컬럼에서 우리가 15,000을 할당할 때 컴파일러는 15와 000을 이해합니다.

이 수정은 저에게 잘 맞습니다.직원(ID, 이름, 성, 성별, 급여) 값에 삽입(4, 'US', 'sam', 'm', 15000)

SQL Server 2016/2017/…관련 문서
데이터베이스를 가져오고 내보낼 수 있는 몇 가지 저장 프로시저가 있습니다.
FILE FILE LISTONLY FROM Disk에 대한 테이블 "# FILE LISTONLY Disk"를 생성합니다.

SQL 서버 2016에서 MS는 필드 스냅샷을 추가했습니다.오류 메시지의 원인이 된 URL nvarchar(360)(url 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

를 확인해 .id정체성일까요?다음과 같이 선언되었는지 확인합니다.ID not null Identity(1,1)

표를 에, 테블을만전에기들.Drop table그리고 나서.create table.

이 오류를 발생시킨 문제는 NULL이 아닌 열에 Null 값을 삽입하려고 한다는 것입니다.

저도 같은 문제가 있었는데, 그 문제를 해결하는 방법이 아마 최선은 아니지만 지금은 잘 되고 있습니다.

링크된 서버를 만들고 동적 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

이건 이제 저한테 효과가 있어요.저장 프로시저에서 동일한 테이블을 반환하기 때문에 저장 프로시저에서 반환되는 열의 수와 유형이 이 표와 동일하다는 것을 보장할 수 있습니다.

저의 경우, 저는 다음과 같습니다.

insert into table1 one
select * from same_schema_as_table1 same_schema
left join...

그리고 나는 변해야만 했습니다.select *select same_schema.*.

삽입 쿼리에서 TableName 뒤에 열 이름이 없습니다.

INSERT INTO TableName**(Col_1,Col_2,Col_3)** VALUES(val_1,val_2,val_3)

제 경우 문제는 실행 중인 SPI가 두 개의 결과 집합을 반환하고 두 번째 결과 집합만 테이블 정의와 일치한다는 것이었습니다.

다른 답변은 삽입 용도로 사용할 수 있지만 다음을 실행할 수도 있습니다.

IF OBJECT_ID('tempdb..@table) IS NOT NULL
    DROP TABLE @table. 
Then go back and rerun 

DECLARE @Table TABLE(        
 Val1 VARCHAR(MAX),
 Val2 VARCHAR(MAX) )  
INSERT INTO @Table SELECT '1' . 

그건 작동할 거야.

저는 근본 원인을 파헤치는 데 상당한 시간을 들인 후에 같은 문제를 해결했습니다.C# 코드의 입력 매개 변수 수가 저장 프로시저의 입력 매개 변수 수와 일치했습니다.저장 프로시저의 출력 매개 변수 수도 C# 코드의 수신 클래스에 있는 변수 수와 일치했습니다.저장 프로시저의 모든 출력 열 이름도 수신 클래스의 변수 이름 하나와 정확히 일치했습니다.

결국 상사와 상의한 후, 문제는 제가 실행한 후에 해결되었습니다.alter procedure아무것도 하지 않은 후 저장 프로시저에 대한 명령.그녀는 이전에도 같은 문제를 만났고 그것을 해결하기 위해 이것을 했습니다.

꽤 이상한 SQL Server 관련 항목!

언급URL : https://stackoverflow.com/questions/1152932/column-name-or-number-of-supplied-values-does-not-match-table-definition