2009-03-16 55 views
16

Tôi cần sao chép các chỉ mục từ bảng này sang bảng khác. Có rất nhiều chỉ mục và tôi không muốn tạo lại chúng từ đầu. Dường như lỗi dễ xảy ra.Cách sao chép các chỉ mục từ bảng này sang bảng khác trong SQL Server

tôi đã sao chép cơ cấu sử dụng

SELECT * INTO [BackupTable] FROM [OriginalTable] 

Nhưng điều đó không sao chép chỉ số, hạn chế, gây nên vv

Có ai biết làm thế nào để làm điều này?

Trả lời

42

Bạn có muốn sao chép định nghĩa chỉ mục không?

Sau đó, bạn có thể thiết kế đối chiếu các chỉ số, gây nên vv bằng cách sử dụng "Script" tùy chọn trong công cụ quản lý Microsoft SQL nhấp chuột

Đơn giản chỉ cần chuột phải vào một tên bảng trong danh sách bảng SQL Management Studio và chọn "Script Bảng như "và sau đó 'Create để'

bạn không thể sao chép dữ liệu Index vì nó liên quan đến việc lưu trữ vật lý của Index

Trước kiểm tra rằng bạn có" Tools/Options/SQL server Object Explorer/Scripting/Chỉ mục tập lệnh "được đặt thành" Đúng ". này được thiết lập để sai trong một số phiên bản của công cụ quản lý SQL (nhờ Mark)

enter image description here

1

Tôi không quen thuộc với SQL Server, tuy nhiên dựa trên cách các bảng cơ sở dữ liệu được xác định và sử dụng trong cơ sở dữ liệu khác, tôi sẽ nói không có cách nào để thực hiện việc này bằng cách sao chép dữ liệu hoặc sử dụng SELECT INTO.

Các chỉ mục cần được xác định là một phần của cấu trúc bảng và cần được tạo cho bất kỳ dữ liệu hiện có nào có thể có trong bảng.

Cách duy nhất để thực hiện điều này là trong câu lệnh CREATE TABLE bằng cách sử dụng câu lệnh ALTER TABLE sau khi bảng đã được tạo.

Báo cáo để làm việc với chính dữ liệu là riêng biệt để làm việc với các định nghĩa bảng vì vậy tôi không nghĩ rằng sẽ có bất kỳ công việc xung quanh hoặc phím tắt cho việc này.

Tôi chắc chắn sẽ có các công cụ có sẵn để tạo câu lệnh ALTER TABLE để tạo tất cả các chỉ mục phù hợp dựa trên bảng bạn đã có, làm cho nó dễ dàng và đáng tin cậy.

1

Bạn có thể xây dựng một kịch bản sử dụng các thông tin trong sysindexes (hoặc sys.indexes tùy thuộc vào phiên bản của bạn) để tái tạo tất cả của các chỉ mục, nhưng việc sử dụng phương pháp Select * vào cũng sẽ không nhận các khóa ngoại và khóa chính hoặc bất kỳ proprties mở rộng nào. Bạn thực sự nên xem xét sử dụng SSIS nếu bạn đang sử dụng phiên bản 2005+ hoặc DTS nếu bạn đang sử dụng 2000, cả hai đều có trình hướng dẫn để đơn giản hóa loại bản sao này.

SSIS Import Export

DTS Import Export

1

Rightclick chỉ số trong SSMS và làm kịch bản như> tạo.

Thay đổi tên bảng và tên chỉ mục và bạn nên được đặt

9

Theo mặc định, kích chuột phải vào bảng "CREATE" không bao gồm các chỉ số hoặc trigger, chỉ cần định nghĩa bảng và trở ngại.

Bạn có thể kích chuột phải vào cơ sở dữ liệu và bấm vào nút "Nhiệm vụ" -> "Tạo Script", mà sẽ cho phép bạn làm điều này

Edit: đây là mặc định nhưng như TFD đề cập đến nó có thể được thay đổi, may mắn .

+1

-1 Chỉ khi bạn có "chỉ số Tools/Options/SQL Server Object Explorer/Scripting/Script" thiết lập để "False". Đây có phải là mặc định trong bản phát hành mới không? – TFD

+1

Làm thế nào về điều đó. Nó rõ ràng là mặc định trong năm 2005 và 2008 R2 (tôi chắc chắn đã không thay đổi nó), và tôi rất vui khi có thể làm điều đó dễ dàng hơn. –

-1

Bạn sẽ nhận được các ý tưởng ở đây

Sub CopyTemp(tblName As String, Optional WithIndex As Boolean = False) 
    Dim db As DAO.Database 
    Dim tDefOrig As DAO.TableDef 
    Dim tDefNew As DAO.TableDef 

    Dim idxOrig As DAO.Index 
    Dim idxNew As DAO.Index 
    Dim fld As DAO.Field 

    Dim tempName As String 

    tempName = "temp" & tblName 

    Set db = CurrentDb 
    db.Execute "Select * Into " & tempName & " From " & tblName 

    If WithIndex = True Then 
     Set tDefOrig = db.TableDefs(tblName) 
     Set tDefNew = db.TableDefs(tempName) 

     For Each idxOrig In tDefOrig.Indexes 
      Set idxNew = tDefNew.CreateIndex(idxOrig.Name) 
      With idxNew 
       For Each fld In idxOrig.Fields 
        .Fields.Append .CreateField(fld.Name) 
       Next 
       .Primary = idxOrig.Primary 
       .Unique = idxOrig.Unique 
      End With 
      tDefNew.Indexes.Append idxNew 
      tDefNew.Indexes.Refresh 
     Next 
    End If 

End Sub 
+1

Chào mừng bạn đến với SO! Cảm ơn bạn đã dành thời gian trả lời câu hỏi của người dùng khác; tuy nhiên, vui lòng đọc [cách trả lời] (http://stackoverflow.com/help/how-to-answer) và đảm bảo bạn đang trả lời câu hỏi đang được hỏi. Thật không may, câu trả lời này không phải là rất hữu ích kể từ khi OP đặc biệt hỏi một câu hỏi SQL server và không nói bất cứ điều gì về việc sử dụng bất kỳ ngôn ngữ lập trình hoặc thư viện, vì vậy câu trả lời này có thể không có ý nghĩa với tác giả hoặc áp dụng cho tình hình của họ. –

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