Подтвердить что ты не робот

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

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

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

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

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

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

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

4b9b3361

Ответ 1

У них нет той же структуры... Я могу гарантировать, что они разные

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

Что вам может понадобиться, это (что также устраняет вашу другую проблему):

Drop table tblTable1

select * into tblTable1 from tblTable1_Link

Ответ 2

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

DECLARE @Table TABLE(
        Val1 VARCHAR(MAX)
)

INSERT INTO @Table SELECT '1'

работает нормально, изменение таблицы def вызывает ошибку

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'

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

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

Ответ 3

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

insert into blah
       select * from blah2

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

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

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

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

Ответ 4

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

error: insert into users values('1', '2','3') - это отлично работает, если у вас всего 3 столбца

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

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

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

Ответ 5

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

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

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

Ответ 6

префикс столбца не совпадает с именем таблицы или псевдонимом, используемым в запросе.

Я также работал над этой ошибкой

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

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

Ответ 7

Вычисляемые столбцы создают проблему. Не используйте SELECT *. Вы должны указать все поля после SELECT, кроме вычисленных полей

Ответ 8

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

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

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

спасибо и приветствую Марсело

Ответ 9

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

Вставьте данные о сотрудниках (ID, FirstName, LastName, Gender, Salary) (3, 'Канада', 'pa', 'm', 15 000)

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

Эта коррекция отлично работает для меня. Вставьте данные о сотрудниках (ID, FirstName, LastName, Gender, Salary) (4, 'US', 'sam', 'm', 15000)

Ответ 10

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

Ответ 11

Обновление до SQL-сервера 2016/2017/...
У нас есть несколько хранимых процедур для импорта и экспорта баз данных.
В sp мы используем (между прочим) ВОССТАНОВИТЬ ФИЛИСТОННО ОТ ДИСКА, где мы создаем таблицу "#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

Ответ 12

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