2010-07-27 44 views
5

Tôi sẽ đổ một số dữ liệu từ một db này sang một db khác. Tôi đang sử dụngchèn danh tính tsql không có danh sách tên cột

set identity_insert MyTable on 
GO 
INSERT INTO MyTable SELECT * FROM sourceDB.dbo.MyTable 
GO 
set identity_insert MyTable off 

Bạn có muốn làm việc này không? Có 30 bảng và sẽ mất nhiều thời gian để thêm danh sách các tên cột vào câu lệnh chèn. Tôi đang sử dụng SQL server 2000. Sẽ được nâng cấp lên SQL server 2008 trong tương lai gần.

EDIT: MyTable có cột nhận dạng.

+0

những gì không hoạt động? Lỗi là gì? –

+0

Giá trị rõ ràng cho cột nhận dạng trong bảng 'MyTable' chỉ có thể được chỉ định khi danh sách cột được sử dụng và IDENTITY_INSERT được BẬT. – David

+0

Nhưng nếu tôi thay đổi câu lệnh chèn vào INSERT INTO MyTable (Col1, Col2, ..., LastColumn) SELECT * FROM sourceDB.dbo.MyTable. Sau đó, nó hoạt động O_O – David

Trả lời

4

Chỉ cần kéo và thả tên cột từ trình duyệt đối tượng. Bạn có thể làm điều đó một bước nó mất khoảng 1 giây dài hơn bằng văn bản chọn * và bạn không bao giờ nên sử dụng chọn * trong mã sản xuất anyway. Đó là một thực hành kém.

Tôi lo lắng về việc bạn chèn cột Danh tính mặc dù, đây là điều gần như không bao giờ được thực hiện. Điều gì sẽ xảy ra nếu bảng gốc có một số cột nhận dạng giống với các id thoát trong bảng mới? Đảm bảo kiểm tra điều này trước khi quyết định chèn các giá trị id từ một bảng khác. Tôi thích làm chèn vào bảng cha và nhận được một id mới và kết hợp nó với id cũ (đầu ra là tốt cho điều này trong năm 2008) và sau đó sử dụng id mới cho bất kỳ bảng con nhưng tham gia vào id cũ.

+0

Cảm ơn. Tôi đang nhân bản 30 bảng gì đó cho máy chủ dev để kiểm tra điều gì đó. – David

3

Chỉ cần thử kịch bản này trên máy SQL Server 2000 SP2, tôi nhận được lỗi này và dường như xác nhận các quan sát của bạn.

Giá trị rõ ràng cho cột nhận dạng trong bảng 'Foo2' chỉ có thể được chỉ định khi danh sách cột được sử dụng và IDENTITY_INSERT được BẬT.

set identity_insert Foo2 on 
GO 
INSERT INTO Foo2 select top 100 * from Foo where id > 110000 
GO 
set identity_insert Foo2 off 

Các SELECT INTO đề nghị sẽ chỉ giúp để có được các dữ liệu vào một bảng dàn dựng. Tại một số thời điểm, bạn phải nêu rõ tên cột.

Mẹo về tên cột: Đánh dấu bảng trong truy vấn SSMS và nhấn Alt-F1 (phím tắt cho sp_help). Sau đó, bạn có thể sao chép/dán kết quả column_name vào truy vấn của mình và chỉ cần thêm dấu phẩy bằng tay. Đi các phím tắt thêm một bước nữa và dán chúng vào Excel, nhập một dấu phẩy và sao chép xuống các cột.

+0

+1. Lúng túng. 2005 đã làm nó mà không có một xô. – Tobiasopdenbrouw

+0

@Tobiasopdenbrouw Tôi gặp lỗi tương tự trên máy chủ sql 2005. – David

0

Nếu bạn không cần phải giữ gìn các giá trị của cột ID, bạn có thể:

Thả cột ID

Hãy cột ID trong schema mới của bạn trong mục tiêu mới DB (làm cho nó cột cuối cùng trong danh sách cột)

INSERT INTO newdb.dbo.newtable 
SELECT * FROM olddb.dbo.oldtable 

Và nó sẽ giữ phần còn lại của cột của bạn trong khi tạo thông tin ID mới.

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