2009-07-20 37 views
31

Trong SQL server, tôi đang cố gắng để chèn giá trị từ một bảng khác bằng cách sử dụng các truy vấn dưới đây:Cột hoặc số của các giá trị cung cấp không khớp với định nghĩa bảng

delete from tblTable1 

insert into tblTable1 select * from tblTable1_Link 

Tôi nhận được lỗi sau:

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

tôi chắc chắn rằng cả hai bảng có cấu trúc tương tự, tên cột và cùng kiểu dữ liệu:

Xin giúp!

+1

Một khả năng nữa là việc đối chiếu DB trên TEMP DB và DB bạn đang chèn vào không khớp. –

Trả lời

26

Họ không có cấu trúc tương tự ... Tôi có thể đảm bảo họ là khác nhau

Tôi biết bạn đã tạo ra nó ... There is already an object named ‘tbltable1’ in the database

Những gì bạn có thể muốn điều này là (mà cũng sửa chữa vấn đề khác của bạn):

Drop table tblTable1 

select * into tblTable1 from tblTable1_Link 
14

cho chèn nó là luôn luôn tốt hơn để xác định tên cột thấy sau

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX) 
) 

INSERT INTO @Table SELECT '1' 

hoạt động tốt, thay đổi def bảng để gây lỗi

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.

Nhưng thay đổi ở trên để

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

INSERT INTO @Table (Val1) SELECT '1' 

công trình. Bạn cần phải cụ thể hơn với các cột định

cung cấp các cấu trúc và chúng ta có thể có một cái nhìn

2

Thả bàn không phải là một lựa chọn cho tôi, vì tôi đang giữ nhật ký đang chạy. Nếu mỗi lần tôi cần chèn tôi phải thả, bàn sẽ là vô nghĩa.

Lỗi của tôi là do tôi có một vài cột trong câu lệnh tạo bảng là các sản phẩm của các cột khác, thay đổi những vấn đề này đã khắc phục được sự cố của tôi. ví dụ

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

Đây là một bài cũ nhưng tôi muốn cũng đề cập rằng nếu bạn có một cái gì đó giống như

insert into blah 
     select * from blah2 

và blah và blah2 là giữ giống hệt nhớ rằng một cột tính sẽ ném lỗi này cùng ...

Tôi chỉ nhận ra rằng khi thất bại trên và tôi đã cố gắng

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

Trong ví dụ của tôi nó là lĩnh vực fullname (tính từ đầu tiên và cuối cùng, vv)

1

Các cột tính toán làm cho các vấn đề. Không sử dụng SELECT *. Bạn phải chỉ định từng trường sau khi CHỌN trừ các trường được tính toán

0

Tôi hy vọng bạn đã tìm được giải pháp tốt. Tôi đã có cùng một vấn đề, và cách tôi làm việc xung quanh nó có lẽ không phải là tốt nhất nhưng nó đang làm việc ngay bây giờ.

nó liên quan đến việc tạo máy chủ được liên kết và sử dụng sql động - không phải là tốt nhất, nhưng nếu có ai có thể đề xuất điều gì đó tốt hơn, vui lòng nhận xét/trả lời.

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 

tính năng này hiện đang hoạt động cho tôi. Tôi có thể đảm bảo số cột và loại cột được trả về bởi quy trình được lưu trữ giống như trong bảng này, đơn giản vì tôi trả về cùng một bảng từ thủ tục được lưu trữ.

cảm ơn và liên quan marcelo

8

Vấn đề là bạn đang cố gắng để chèn dữ liệu vào cơ sở dữ liệu mà không cần sử dụng cột. Máy chủ Sql cung cấp cho bạn thông báo lỗi đó.

lỗi: insert into users values('1', '2','3') - điều này hoạt động tốt chừng nào bạn chỉ có 3 cột

nếu bạn có 4 cột nhưng chỉ muốn chèn vào 3 trong số họ

đúng: insert into users (firstName,lastName,city) values ('Tom', 'Jones', 'Miami')

hy vọng điều này giúp

0

Đối với tôi thủ phạm là giá trị int được chỉ định cho mức lương

Chèn vào Emp các giá trị loyees (ID, FirstName, LastName, Gender, Salary) (3, 'Canada', 'pa', 'm', 15,000)

trong cột lương Khi chúng tôi gán 15.000 trình biên dịch hiểu 15 và 000.

Hiệu chỉnh này hoạt động tốt cho tôi. Chèn vào các giá trị nhân viên (ID, FirstName, LastName, Gender, Salary) (4, 'US', 'sam', 'm', 15000)

0

kiểm tra id của bạn là Nhận dạng, nếu sau đó đảm bảo có ID không null Identity (1,1) và trước khi tạo bảng của bạn, thả bảng và sau đó tạo bảng .. Sau 2 ngày tôi đã giải quyết vấn đề này của mình ..

Các vấn đề liên quan