2012-03-05 24 views
15

Trong db của chúng tôi có một bảng có ít hơn 80 cột. Nó có một khóa chính và chèn tính năng được bật. Tôi đang tìm cách chèn vào bảng này mỗi cột EXCEPT cột khóa chính từ một bảng giống hệt nhau trong một DB khác.T-SQL Chèn vào bảng mà không cần phải chỉ định từng cột

Điều này có khả thi không?

+1

Bạn cần chỉ định các cột ... – JNK

+0

Âm thanh như trường hợp lập trình lười biếng. Nếu bạn nhấp chuột phải vào tên bảng, bạn có thể "tập lệnh dưới dạng -> chèn vào" và tất cả các cột không xác định sẽ được viết cho bạn. Shazam. –

+0

YoOu sẽ được hưởng lợi hiệu suất cơ sở dữ liệu cho lâu dài không phải là chính bạn. Bạn chấp nhận câu trả lời tồi tệ nhất của bó bởi vì nó tăng gấp đôi công việc mỗi khi nó được chạy trên những gì truy vấn chính xác sẽ mất và tất cả để tiết kiệm cho mình một chút thời gian. – HLGEM

Trả lời

40

Bạn có thể làm được điều này khá dễ dàng thực:

-- Select everything into temp table 
Select * Into 
    #tmpBigTable 
    From [YourBigTable] 

-- Drop the Primary Key Column from the temp table 
Alter Table #tmpBigTable Drop Column [PrimaryKeyColumn] 

-- Insert that into your other big table 
Insert Into [YourOtherBigTable] 
    Select * From #tmpBigTable 

-- Drop the temp table you created 
Drop Table #tmpBigTable 

Miễn là bạn có nhận dạng Insert On trong "YourOtherBigTable" và các cột là hoàn toàn giống hệt nhau bạn sẽ ổn.

+3

SELECT * là một mẫu giả. Điều này tạo ra nhiều công việc hơn cho máy chủ hơn là viết chính xác chèn bằng các cột. Đây là một giải pháp rất tệ. Bạn đang thực hiện một mess hiệu suất để tiết kiệm mười giây kéo các cột trên từ đối tượng tbrowser. Đây là một thực tế không thể chấp nhận cho một chuyên gia. – HLGEM

+1

Cũng đừng quên rằng trong trường hợp này bạn đang sao chép toàn bộ bảng vào một bảng tạm thời. Nếu bạn chỉ có một vài hàng, điều này có thể hoạt động, nhưng nó thực sự có thể làm hỏng hệ thống cho một bảng có nhiều hàng. – Kibbee

+1

-1 vì những lý do đã được đưa ra bởi @HLGEM. –

2

Bạn có thể truy vấn Information_Schema để lấy danh sách tất cả các cột và tạo ra các tên cột cho truy vấn của bạn theo chương trình. Nếu bạn đang làm điều này tất cả trong t-sql nó sẽ là cồng kềnh, nhưng nó có thể được thực hiện. Nếu bạn đang sử dụng một số ngôn ngữ máy khách khác, như C# để thực hiện thao tác, nó sẽ ít phức tạp hơn một chút.

2

Không, điều đó là không thể. Bạn có thể bị cám dỗ sử dụng

INSERT INTO MyLargeTable SELECT * FROM OtherTable 

Nhưng điều đó sẽ không hiệu quả, vì cột nhận dạng của bạn sẽ được bao gồm trong *.

Bạn có thể sử dụng

SET IDENTITY_INSERT MyLargeTable ON 
INSERT INTO MyLargeTable SELECT * FROM OtherTable 
SET IDENTITY_INSERT MyLargeTable OFF 

giá trị bản sắc đầu tiên bạn kích hoạt chèn, hơn bạn sao chép các hồ sơ, sau đó bạn bật cột sắc một lần nữa.

Nhưng điều này sẽ không hoạt động. Máy chủ SQL sẽ không chấp nhận * trong trường hợp này. Bạn phải bao gồm rõ ràng Id trong tập lệnh, như:

SET IDENTITY_INSERT MyLargeTable ON 
INSERT INTO MyLargeTable (Id, co1, col2, ...., col80) SELECT Id, co1, col2, ...., col80 FROM OtherTable 
SET IDENTITY_INSERT MyLargeTable OFF 

Vì vậy, chúng tôi trở lại từ nơi chúng tôi bắt đầu.

Cách dễ nhất là nhấp chuột phải vào bảng trong Management Studio, để cho nó tạo tập lệnh INSERT và SELECT và chỉnh sửa chúng một chút để chúng hoạt động cùng nhau.

0

Thực sự, trung thực mất mười giây hoặc ít hơn để kéo tất cả các cột từ trình duyệt đối tượng và sau đó xóa cột nhận dạng khỏi danh sách. Đó là một ý tưởng tồi để sử dụng lựa chọn * cho bất cứ điều gì nhưng truy vấn quảng cáo nhanh.

+2

Nhưng nếu OP là một truy vấn quảng cáo nhanh thì sao?;) – onedaywhen

+0

Nếu bạn muốn làm điều tương tự cho tất cả 1000 bảng của mình thì sao? Và điều gì sẽ xảy ra nếu danh sách các cột trong bảng thường được nối vào và bạn không muốn phải cập nhật truy vấn mỗi lần? –

+0

Bạn nên cập nhật truy vấn mỗi khi bạn không cần cột mới. Nó là vô trách nhiệm để làm bất cứ điều gì khác. Bạn có thể sẽ chỉ hiển thị các trường người dùng mà họ không chỉ quan tâm mà không nên xem. Hoặc bạn có thể kết thúc với chèn chèn dữ liệu vào cột sai vì ai đó đã thay đổi thứ tự cột trong một bảng nhưng không phải cột khác hoặc chèn bị phá vỡ vì cột mới không được thêm vào bảng lấy dữ liệu từ một lựa chọn. Bạn cũng có thể cần điều chỉnh cập nhật cho các cột mới. Bạn có thể cần phải tìm ra những gì các dữ liệu intial sẽ được cho chèn. – HLGEM

-1

Trong câu trả lời cho câu hỏi liên quan (SELECT * EXCEPT), tôi chỉ ra ngôn ngữ thực sự quan hệ Tutorial D cho phép chiếu được thể hiện dưới dạng thuộc tính cần xóa thay vì các thuộc tính cần được giữ

my_relvar { ALL BUT description } 

Tuy nhiên cú pháp INSERT của nó đòi hỏi nhà xây dựng giá trị tuple để bao gồm thuộc tính cặp tên/giá trị ví dụ

INSERT P 
    RELATION 
    { 
     TUPLE { PNO PNO ('P1') , PNAME CHARACTER ('Nut') }, 
     TUPLE { PNO PNO ('P2') , PNAME CHARACTER ('Bolt') } 
    }; 

Tất nhiên, sử dụng cú pháp này không có thứ tự cột (vì nó thực sự quan hệ!) Ví dụ: đây là tương đương về mặt ngữ nghĩa:

INSERT P 
    RELATION 
    { 
     TUPLE { PNO PNO ('P1') , PNAME CHARACTER ('Nut') }, 
     TUPLE { PNAME CHARACTER ('Bolt') , PNO PNO ('P2') } 
    }; 

Cách khác là dựa hoàn toàn vào thứ tự thuộc tính, mà phần nào của SQL, ví dụ:đây là một SQL tương đương gần với phần trên:

INSERT INTO P (PNO , PNAME) 
    VALUES   
     (PNO ('P1') , CAST ('Nut' AS VARCHAR (20))) , 
     (PNO ('P2') , CAST ('Bolt' AS VARCHAR (20))); 

Khi commalist các cột đã được xác định các VALUES constructors hàng có duy trì trật tự này, mà không phải là lý tưởng. Nhưng ít nhất là thứ tự được chỉ định: đề xuất của bạn sẽ dựa vào một số thứ tự mặc định có thể có thể không xác định.

3
CREATE TABLE Tests 
(
    TestID int IDENTITY PRIMARY KEY, 
    A int, 
    B int, 
    C int 
) 

INSERT INTO dbo.Tests 
VALUES (1,2,3) 

SELECT * FROM Tests 

này hoạt động trong SQL2012

1

Tại sao không chỉ cần tạo một VIEW của dữ liệu gốc, loại bỏ các lĩnh vực không mong muốn? Sau đó 'Chọn * vào' mong muốn trái tim của bạn.

  • kiểm soát Localized trong một cái nhìn đơn
  • Không cần phải sửa đổi SPROC
  • Add/thay đổi/xóa các lĩnh vực dễ
  • Không cần phải truy vấn meta-data
  • Không bảng tạm thời
+0

Tại sao tạo bảng tạm thời được liệt kê là bất lợi so với sử dụng chế độ xem? Tôi không đặt câu hỏi về yêu cầu bồi thường, chỉ cần tự hỏi về lý do. –

+0

Bảng TEMP (có thể) sử dụng một lượng lớn bộ nhớ/đĩa, trong đó VIEW cơ bản lọc bảng sản xuất đến các trường bạn muốn. Phương pháp này sẽ hoạt động nhanh hơn, không có bất kỳ chi phí lâu dài nào và có thể thay đổi theo ý muốn. – davidWazy

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