Имя столбца или количество предоставленных значений не соответствует определению таблицы - PullRequest
39 голосов
/ 20 июля 2009

На сервере SQL я пытаюсь вставить значения из одной таблицы в другую, используя следующий запрос:

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

Я получаю следующую ошибку:

Имя столбца или количество предоставленных значений не соответствует определению таблицы.

Я уверен, что обе таблицы имеют одинаковую структуру, одинаковые имена столбцов и одинаковые типы данных.

Пожалуйста, помогите!

Ответы [ 12 ]

37 голосов
/ 20 июля 2009

Они не имеют одинаковую структуру ... Я могу гарантировать, что они разные

Я знаю, что вы уже создали его ... В базе данных уже есть объект с именем "tbltable1"

То, что вы можете хотеть, это (что также решает другую проблему):

Drop table tblTable1

select * into tblTable1 from tblTable1_Link
19 голосов
/ 20 июля 2009

для вставок всегда лучше указывать имена столбцов, см. Следующее

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'

Сообщение 213, уровень 16, состояние 1, строка 6 Ошибка вставки: имя столбца или номер предоставленные значения не соответствуют таблице определение.

Но изменив вышеприведенное на

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

INSERT INTO @Table (Val1)  SELECT '1'

работает. Вы должны быть более конкретными с указанными столбцами

поставляем конструкции, и мы можем посмотреть

14 голосов
/ 09 августа 2012

Это более старая запись, но я хочу также упомянуть, что если у вас есть что-то вроде

insert into blah
       select * from blah2

и бла и бла2 одинаковы, имейте в виду, что вычисляемый столбец выдаст ту же ошибку ...

Я только что понял, что когда вышеперечисленное не удалось, и я попытался

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

В моем примере это было полное имя (вычисляется из первого и последнего и т. Д.)

9 голосов
/ 26 марта 2016

Проблема в том, что вы пытаетесь вставить данные в базу данных без использования столбцов. Sql-сервер выдает это сообщение об ошибке.

ошибка: insert into users values('1', '2','3') - это работает нормально, если у вас есть только 3 столбца

если у вас есть 4 столбца, но вы хотите вставить только 3 из них

правильно: insert into users (firstName,lastName,city) values ('Tom', 'Jones', 'Miami')

надеюсь, это поможет

2 голосов
/ 06 марта 2012

Удаление таблицы не было для меня возможным, так как я веду текущий журнал. Если бы каждый раз, когда мне нужно было вставить, я должен был уронить, таблица была бы бессмысленной.

Моя ошибка была из-за того, что в операторе создания таблицы было несколько столбцов, которые были продуктами других столбцов, и изменение их решило мою проблему. например,

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 голосов
/ 17 декабря 2018

Остерегайтесь триггеров. Возможно, проблема в какой-то операции в триггере для вставленных строк.

0 голосов
/ 01 октября 2018

Обновление до SQL Server 2016/2017 /…
У нас есть некоторые хранимые процедуры для импорта и экспорта баз данных.
В sp мы используем (среди прочего) RESTORE FILELISTONLY С DISK, где мы создаем таблица "#restoretemp" для восстановления из файла.

В SQL Server 2016 MS добавила поле SnapshotURL 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
0 голосов
/ 07 июня 2017

проверьте, что ваш идентификатор это Идентичность, если это так, убедитесь, что есть идентификатор не ноль Идентичность (1,1) и перед созданием таблицы удалите таблицу, а затем создайте таблицу. Через 2 дня я решил эту проблему ..

0 голосов
/ 14 сентября 2016

Для меня виновником является значение int, присвоенное окладу

Вставить в значения сотрудников (ID, FirstName, LastName, Gender, Salary) (3, «Канада», «pa», «m», 15 000)

в столбце окладов Когда мы присваиваем 15 000, компилятор понимает 15 и 000.

Это исправление отлично работает для меня. Вставьте в значения сотрудников (ID, FirstName, LastName, Gender, Salary) (4, «США», «sam», «m», 15000)

0 голосов
/ 22 марта 2014

Надеюсь, вы нашли хорошее решение. У меня была та же проблема, и способ, которым я обошел ее, вероятно, не самый лучший, но она работает сейчас.

это включает создание связанного сервера и использование динамического 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

это работает для меня сейчас. Я могу гарантировать, что количество столбцов и тип столбцов, возвращаемых хранимой процедурой, такие же, как в этой таблице, просто потому, что я возвращаю ту же таблицу из хранимой процедуры.

спасибо и всего наилучшего Марсело

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...