2009-07-20 5 views
31

Dans le serveur SQL, je suis en train d'insérer des valeurs d'une table à l'autre en utilisant la requête suivante:Nom de la colonne ou le nombre de valeurs fournies ne correspond pas à la définition de table

delete from tblTable1 

insert into tblTable1 select * from tblTable1_Link 

Je reçois l'erreur suivante:

Column name or number of supplied values does not match table definition. 

Je suis sûr que les deux table ayant même structure, les noms de colonnes et le même type de données:

S'il vous plaît aider!

+1

Une possibilité de plus est que le collation DB sur votre La base de données TEMP et la base de données dans laquelle vous insérez ne correspondent pas. –

Répondre

26

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

Je sais que vous avez déjà créé il ... There is already an object named ‘tbltable1’ in the database

Ce que vous voudrez peut-être est-ce (qui a également fixe votre autre question):

Drop table tblTable1 

select * into tblTable1 from tblTable1_Link 
14

pour inserts il est toujours préférable de spécifier les noms de colonnes voir les éléments suivants

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX) 
) 

INSERT INTO @Table SELECT '1' 

fonctionne très bien, en changeant la table def provoque l'erreur

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

INSERT INTO @Table SELECT '1' 

Msg 213, Level 16, State 1, Line 6 Insert Error: Column name or number of supplied values does not match table definition.

Mais changer ce qui précède à

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

INSERT INTO @Table (Val1) SELECT '1' 

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

fournir les structures et nous pouvons jeter un oeil

2

laissant tomber la table n'a pas été une option pour moi, puisque je garde un journal en cours d'exécution. Si chaque fois que j'avais besoin d'insérer je devais laisser tomber, la table n'aurait aucun sens. Mon erreur était parce que j'avais quelques colonnes dans l'instruction create table qui étaient des produits d'autres colonnes, en changeant ceux-ci ont 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 
10

Ceci est un article plus ancien, mais je veux aussi mentionner que si vous avez quelque chose comme

insert into blah 
     select * from blah2 

et bla et blah2 sont keep identiques à l'esprit qu'une colonne calculée va lancer cette même erreur ...

Je viens de réaliser que lorsque ce qui précède et j'ai essayé échoué

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

Dans mon exemple, il était champ fullname (calculé à partir de premier et dernier, etc.)

1

Les colonnes calculées font le problème. Ne pas utiliser SELECT *. Vous devez spécifier chaque champs après SELECT sauf les champs calculés

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é autour n'est probablement pas la meilleure mais ça marche maintenant.

il s'agit de créer un serveur lié et d'utiliser SQL dynamique - pas le meilleur, mais si quelqu'un peut suggérer quelque chose de mieux, s'il vous plaît 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 retournées par la procédure stockée sont les mêmes que dans cette table, simplement parce que je retourne la même table de la procédure stockée.

Merci et salutations marcelo

8

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

erreur: insert into users values('1', '2','3') - cela fonctionne bien aussi longtemps que vous avez seulement 3 colonnes

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

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

this helps

0

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

Insérer dans Emp loyees (ID, FirstName, LastName, genre, salaire) valeurs (3, Canada ', 'pa', 'm', 15 000)

dans la colonne de salaire Lorsque nous attribuons 15 000 le compilateur comprend 15 et 000

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

0

vérifiez votre ID est-il identité, si c'est alors assurez-vous il y a ID non null Identité (1,1) et avant de créer votre table, déposer la table, puis créer une table .. Après 2 jours j'ai résolu mon ce problème ..

Questions connexes