web-dev-qa-db-fra.com

Le nom de colonne ou le nombre de valeurs fournies ne correspond pas à la définition de la table

Dans SQL Server, j'essaie d'insérer des valeurs d'une table à une autre en utilisant la requête ci-dessous:

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

Je reçois l'erreur suivante:

Le nom de colonne ou le nombre de valeurs fournies ne correspond pas à la définition de la table.

Je suis sûr que les deux tables ont la même structure, les mêmes noms de colonne et les mêmes types de données.

S'il vous plaît aider!

34
Jaison

Ils n'ont pas la même structure ... Je peux vous garantir qu'ils sont différents

Je sais que vous l’avez déjà créé ... Il existe déjà un objet nommé ‘tbltable1’ dans la base de données

Voici ce que vous voudrez peut-être (ce qui corrige également votre autre problème):

Drop table tblTable1

select * into tblTable1 from tblTable1_Link
31
gbn

pour les insertions, il est toujours préférable de spécifier les noms de colonne, voir ce qui suit

DECLARE @Table TABLE(
        Val1 VARCHAR(MAX)
)

INSERT INTO @Table SELECT '1'

fonctionne bien, changer la définition de table en provoque l'erreur 

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

INSERT INTO @Table SELECT '1'

Msg 213, niveau 16, état 1, ligne 6 Insert Error: Nom de colonne ou numéro de les valeurs fournies ne correspondent pas à la table définition.

Mais changer ce qui précède pour 

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

INSERT INTO @Table (Val1)  SELECT '1'

travaux. Vous devez être plus précis avec les colonnes spécifiées

fournir les structures et nous pouvons jeter un oeil

18
Adriaan Stander

Ceci est un post plus ancien, mais je tiens également à mentionner que si vous avez quelque chose comme

insert into blah
       select * from blah2

et bla et bla2 sont identiques, gardez à l'esprit qu'une colonne calculée lève cette même erreur ...

Je viens de me rendre compte que lorsque ce qui précède a échoué et que j'ai essayé

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

Dans mon exemple, il s’agissait du champ nom complet (calculé à partir du premier et du dernier, etc.)

14
Kris Benedict

Le problème est que vous essayez d'insérer des données dans la base de données sans utiliser de colonnes. Le serveur SQL vous donne ce message d'erreur.

error: insert into users values('1', '2','3') - cela fonctionne bien tant que vous n'avez que 3 colonnes

si vous avez 4 colonnes mais que vous voulez seulement insérer dans 3 d'entre elles

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

j'espère que cela t'aides

9
CodeCoder

Abandonner la table n'était pas une option pour moi, car je tiens un journal en cours d'exécution. Si chaque fois que je devais insérer, je devais tomber, la table n'aurait aucun sens.

Mon erreur est due au fait que deux des colonnes de l'instruction create table étaient des produits d'autres colonnes. Leur modification a résolu mon problème. par exemple

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
2
ScottieB

Pour moi, le coupable est la valeur int attribuée au salaire

Insérer dans les employés (ID, Prénom, Nom, Sexe, Salaire), valeurs (3, 'Canada', 'pa', 'm', 15 000)

dans la colonne des salaires Lorsque nous assignons 15 000, le compilateur comprend 15 et 000.

Cette correction fonctionne bien pour moi . Insérer dans Employees (ID, Prénom, Nom, Sexe, Salaire), valeurs (4, 'US', 'sam', 'm', 15000)

0
Kris Sam

vérifiez votre identifiant est-il Identité, si c'est le cas, assurez-vous qu'il existe un identifiant non nul Identité (1,1) ce problème.. 

0

J'espère que vous avez trouvé une bonne solution… J'ai eu le même problème, et la façon dont j'ai travaillé n'est probablement pas la meilleure, mais ça fonctionne maintenant.

cela implique la création d'un serveur lié et l'utilisation de SQL dynamique - ce n'est pas le meilleur, mais si quelqu'un peut suggérer quelque chose de mieux, merci de commenter/répondre.

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

cela fonctionne pour moi maintenant ... Je peux garantir que le nombre de colonnes et le type de colonnes renvoyées par la procédure stockée sont les mêmes que dans cette table, tout simplement parce que je retourne la même table à partir de la procédure stockée.

merci et salutations marcelo

0
marcello miorelli

Les colonnes calculées posent le problème. N'utilisez pas SELECT *. Vous devez spécifier chaque champ après SELECT sauf les champs calculés 

0
GyurcIT

Méfiez-vous des déclencheurs. Peut-être que le problème vient d'une opération dans le déclencheur pour les lignes insérées.

0
linitux

le préfixe de colonne ne correspond pas à un nom de table ou à un alias utilisé dans la requête.

Je travaillais aussi pour résoudre cette erreur

Nw j'ai trouvé pourquoi il vient juste besoin de faire de petits changements dans la requête

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

0
Sumasn

Mise à jour vers SQL Server 2016/2017 /…
Nous avons quelques procédures stockées en place pour importer et exporter des bases de données.
Dans le sp, nous utilisons (entre autres choses) RESTORE FILELISTONLY FROM DISK où nous créons une table "#Restoretemp" pour la restauration à partir d'un fichier. 

Avec SQL Server 2016, MS a ajouté un champ SnapshotURL nvarchar (360) (URL de restauration Azure) qui a provoqué le message d'erreur.
Après l'amélioration du champ supplémentaire, la restauration a de nouveau fonctionné.
Code saisi (voir dernier champ):

 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
FredyWenger