Tôi có thể sắp xếp lại các cột trong bảng một cách hợp lý không?


93

Nếu tôi đang thêm một cột vào bảng trong Microsoft SQL Server, tôi có thể kiểm soát vị trí cột được hiển thị một cách hợp lý trong các truy vấn không?

Tôi không muốn làm rối với bố cục vật lý của các cột trên đĩa, nhưng tôi muốn nhóm các cột lại với nhau một cách hợp lý khi có thể để các công cụ như SQL Server Management Studio liệt kê nội dung của bảng một cách thuận tiện.

Tôi biết rằng tôi có thể thực hiện điều này thông qua SQL Management Studio bằng cách vào chế độ "thiết kế" của họ cho các bảng và kéo thứ tự các cột xung quanh, nhưng tôi muốn có thể thực hiện điều đó trong SQL thô để tôi có thể thực hiện việc sắp xếp kịch bản từ dòng lệnh.


Quá muộn để có câu trả lời nhưng hãy xem liên kết này. blog.sqlauthority.com/2013/03/11/…
sqluser



và một câu hỏi liên quan khác, về việc liệu nó có quan trọng hay không stackoverflow.com/questions/6692021/…
Tim Abell

microsoft connect: Cú pháp ALTER TABLE để thay đổi thứ tự cột - phản hồi là loại ấm trà sô cô la như thường lệ WONTFIX
Tim Abell

Câu trả lời:


77

Bạn không thể thực hiện việc này theo chương trình (theo cách an toàn) mà không tạo một bảng mới.

Những gì Enterprise Manager thực hiện khi bạn thực hiện sắp xếp lại là tạo một bảng mới, di chuyển dữ liệu và sau đó xóa bảng cũ và đổi tên bảng mới thành tên hiện có.

Nếu bạn muốn các cột của mình theo một thứ tự / nhóm cụ thể mà không làm thay đổi thứ tự thực của chúng, bạn có thể tạo chế độ xem có thể là bất kỳ thứ gì bạn muốn.


43

Tôi nghĩ điều mà tất cả mọi người ở đây đều thiếu, đó là mặc dù không phải ai cũng phải đối phó với các trường hợp 10, 20 hoặc 1000 của cùng một hệ thống phần mềm được cài đặt trên khắp đất nước và thế giới ... những người trong chúng ta thiết kế phần mềm bán thương mại đều làm như vậy. Do đó, chúng tôi mở rộng hệ thống theo thời gian, mở rộng bảng bằng cách thêm các trường khi cần khả năng mới và khi các trường đó được xác định là thuộc về một bảng hiện có và như vậy, trong hơn một thập kỷ mở rộng, phát triển, thêm trường, v.v. tới các bảng .... và sau đó phải làm việc với các bảng đó từ thiết kế, hỗ trợ, đôi khi đào sâu vào dữ liệu thô / khắc phục sự cố để gỡ lỗi chức năng mới .... thật vô cùng trầm trọng khi không có thông tin chính bạn muốn xem trong số ít các trường đầu tiên,

Tôi thường ước mình có thể làm được điều này, vì lý do chính xác này. Nhưng không làm được chính xác những gì SQL làm, Xây dựng Tập lệnh Tạo cho một Bảng mới theo cách tôi muốn, viết Chèn vào đó, sau đó loại bỏ tất cả các ràng buộc, mối quan hệ, khóa, chỉ mục, v.v. hiện có từ bảng hiện có và đổi tên bảng "mới" trở về tên cũ, rồi đọc tất cả các khóa, mối quan hệ, chỉ mục, v.v., v.v.

Không chỉ tẻ nhạt, tốn thời gian mà ... trong năm năm nữa, sẽ cần phải xảy ra một lần nữa ....

Nó gần như xứng đáng với khối lượng công việc khổng lồ đó, tuy nhiên vấn đề là ... đây sẽ không phải là lần cuối cùng chúng ta cần khả năng này, vì hệ thống của chúng ta sẽ tiếp tục phát triển, mở rộng và nhận được các trường theo thứ tự được điều khiển bởi cần bổ sung / thiết kế.

Đa số các nhà phát triển nghĩ từ quan điểm hệ thống duy nhất phục vụ cho một công ty hoặc thị trường hộp cứng rất cụ thể.

Các nhà thiết kế và các nhà lãnh đạo phát triển trong không gian thị trường "vô dụng" nhưng có tiến bộ đáng kể sẽ luôn phải đối phó với vấn đề này, lặp đi lặp lại ..... rất thích một giải pháp sáng tạo nếu có. Điều này có thể dễ dàng tiết kiệm cho công ty của tôi hàng chục giờ một tuần, chỉ cần không phải cuộn qua hoặc nhớ trường "đó" ở đâu trong bảng dữ liệu nguồn ....


Chúng tôi gặp vấn đề tương tự và đã tạo một thủ tục được lưu trữ để tự động hóa quá trình này (đổi tên, tạo bảng mới, sao chép, tạo lại tất cả các khóa ngoại, ràng buộc, v.v.). Bạn chỉ cần chuyển vào tên bảng và thứ tự mới của các cột. Nếu điều này thực sự có thể tiết kiệm cho công ty của bạn hàng chục giờ mỗi tuần, bạn nên đầu tư thời gian để viết một kịch bản tương tự. Đối với chúng tôi, chỉ mất khoảng 2-3 ngày để có một tập lệnh ổn định mà chúng tôi sử dụng thường xuyên để sắp xếp lại các cột. Nó quản lý tất cả các tính năng chúng tôi sử dụng trong SqlServer (ví dụ: chỉ mục một phần, chế độ xem được lập chỉ mục, v.v.) và chỉ bao gồm khoảng 400 LOC.
Andreas

Tôi không biết tại sao họ không thể trừu tượng hóa bố cục cột bằng cách nào đó. Nó không phải sắp xếp lại vật lý các cột! Số lượng cấp độ PHD và kỹ thuật cao hơn trong Sql Server thực sự đáng kinh ngạc. Khi bạn xem xét sự phức tạp của việc tạo kế hoạch truy vấn, thống kê, lập chỉ mục và chưa ai đứng lên và nói 'Chúng ta hãy chỉ tạo một bảng đại diện cho thứ tự LOGICAL. FieldID Guid, OrderBy int. Làm xong. Sau đó, SSMS hoặc SELECT *sử dụng đó. Tắt nó đi nếu bạn là một DBA hoàn hảo và không muốn nó. Rất bực bội. Và bây giờ bàn của tôi đủ lớn để tôi không thể thô bạo ép nó nữa.
Simon_Weaver

Tôi biết đây là một nhận xét cũ, nhưng studio trực quan trong dự án cơ sở dữ liệu sẽ tự động tạo tập lệnh SQL để sắp xếp lại cột vật lý khi bạn thay đổi lược đồ của bảng và nhấn xuất bản.
Muflix

5

Nếu tôi hiểu câu hỏi của bạn, bạn muốn ảnh hưởng đến những cột nào được trả về đầu tiên, thứ hai, thứ ba, v.v. trong các truy vấn hiện có , phải không?

Nếu tất cả các truy vấn của bạn được viết bằng SELECT * FROM TABLE- thì chúng sẽ hiển thị trong đầu ra như được trình bày trong SQL.

Nếu các truy vấn của bạn được viết bằng SELECT Field1, Field2 FROM TABLE- thì thứ tự chúng được trình bày trong SQL không quan trọng.


3

Khi Management Studio làm điều đó, đó là tạo một bảng tạm thời, sao chép mọi thứ trên toàn bộ, xóa bảng gốc của bạn và đổi tên bảng tạm thời. Không có câu lệnh T-SQL tương đương đơn giản nào.

Nếu bạn không thích làm điều đó, bạn luôn có thể tạo chế độ xem bảng với các cột theo thứ tự bạn muốn và sử dụng nó?

Chỉnh sửa: bị đánh bại!


1

Có một cách, nhưng chỉ tạm thời cho chính truy vấn. Ví dụ,

Giả sử bạn có 5 bảng. Bảng được gọi làT_Testing

FirstName, LastName, PhoneNumber, Email và Member_ID

bạn muốn nó liệt kê ID của họ, sau đó Họ, rồi Tên, rồi Điện thoại rồi Email.

Bạn có thể làm điều đó theo Lựa chọn.

Select Member_ID, LastName, FirstName, PhoneNumber, Email
From T_Testing

Ngoài ra, nếu bạn chỉ muốn LastName hiển thị trước tên vì một lý do nào đó, bạn cũng có thể làm điều đó như sau:

Select LastName, *
From T_Testing

Điều duy nhất bạn muốn chắc chắn rằng bạn làm là Hàm OrderBy hoặc Where cần được ký hiệu là Table.Column nếu bạn đang sử dụng Where hoặc OrderBy

Thí dụ:

Select LastName, *
From T_Testing
Order By T_Testing.LastName Desc

Tôi hy vọng điều này sẽ hữu ích, tôi đã tìm ra nó vì tôi cần phải tự mình làm điều này.


Trong truy vấn này Chọn LastName, * Từ T_Testing, bạn nhận được LastName hai lần.
sqluser

1
  1. Viết bảng hiện có của bạn vào một cửa sổ truy vấn.
  2. Chạy tập lệnh này trên cơ sở dữ liệu Kiểm tra (xóa câu lệnh Sử dụng)
  3. Sử dụng SSMS để thực hiện các thay đổi cột mà bạn cần
  4. Nhấp vào Tạo tập lệnh thay đổi (biểu tượng ngoài cùng bên trái và dưới cùng trên thanh nút, theo mặc định)
  5. Sử dụng tập lệnh này so với bảng thực của bạn

Tất cả những gì kịch bản thực sự làm là tạo một bảng bảng thứ hai với các thứ tự cột mong muốn, sao chép tất cả dữ liệu của bạn vào đó, bỏ bảng gốc và sau đó đổi tên bảng phụ để thay thế. Điều này sẽ giúp bạn tiết kiệm khi tự viết nó nếu bạn muốn có một kịch bản triển khai.



0

Không thể thay đổi thứ tự của các cột mà không tạo lại toàn bộ bảng. Nếu bạn chỉ có một vài trường hợp của cơ sở dữ liệu, bạn có thể sử dụng SSMS cho việc này (Chọn bảng và nhấp vào "thiết kế").

Trong trường hợp bạn có quá nhiều phiên bản cho quy trình thủ công, bạn nên thử tập lệnh này: https://github.com/Epaminaidos/reorder-columns

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.