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!
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
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
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.)
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
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
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)
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..
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
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
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.
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
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