Làm cách nào để thay đổi thứ tự cột trong bảng bằng truy vấn sql trong sql server 2005?


109

Làm cách nào để thay đổi thứ tự cột trong bảng bằng cách sử dụng truy vấn SQL trong SQL Server 2005?

Tôi muốn sắp xếp lại thứ tự cột trong bảng bằng cách sử dụng truy vấn SQL.


3
Nếu bạn đang đề cập đến việc thay đổi vị trí của các cột khi chúng tồn tại trong bảng, bạn sẽ cần tạo một bảng mới với thứ tự ưu tiên, chèn dữ liệu từ bảng cũ, sau đó bỏ bảng ban đầu. Không có cách nào khác (theo hiểu biết của tôi) để làm điều đó.
Michael Todd

Bạn đang nói về thứ tự cột trên câu lệnh SELECT hay thứ tự cột trong định nghĩa bảng?
marc_s

Câu trả lời:


111

Bạn không thể. Thứ tự cột chỉ là một thứ "thẩm mỹ" mà con người chúng ta quan tâm - đối với SQL Server, nó hầu như luôn hoàn toàn không liên quan.

Những gì SQL Server Management Studio thực hiện trong nền khi bạn thay đổi thứ tự cột, đó là tạo lại bảng từ đầu bằng một CREATE TABLElệnh mới , sao chép dữ liệu từ bảng cũ, rồi xóa nó.

Không có lệnh SQL nào để xác định thứ tự cột.


4
Không, không có những điều như vậy ni SQL Server - và không nên trong bất kỳ RBDMS thực - trật tự cột không phải là một khái niệm có liên quan đến một bảng SQL
marc_s

68
@marc_s Không có lý do chính đáng nào để chống lại thứ tự cột. Ngay cả khi nó chỉ là hình ảnh. Nó chỉ đơn giản là có thể giúp bạn xem dữ liệu trong bảng với thứ tự cột nhất định dễ dàng hơn khi bạn thực hiện "CHỌN *". Tôi là một nhà phát triển và thực hiện loại truy vấn này mọi lúc. Bạn có thể dành chút thời gian với một thứ tự cột được xác định trước tốt. Tất nhiên, từ bất kỳ quan điểm nào khác, nó không có ý nghĩa: không có gì phải phụ thuộc vào thứ tự cột. Nhân tiện, có một cột ORDINAL_POSITION khi bạn truy vấn "INFORMATION_SCHEMA.COLUMNS". Tôi không biết nó có nghĩa là gì ... nhưng nó phải liên quan đến điều này.
JotaBe

18
Thứ tự cột có liên quan, ví dụ khi sử dụng CHÈN VÀO mà không chỉ định tên cột. Một ví dụ khác là ĐẶT HÀNG THEO chỉ số cột thay vì tên cột. Cả hai thực tiễn rõ ràng không được khuyến nghị, nhưng SQL Server cho phép nó nên ai đó có thể đã sử dụng nó ở đâu đó, có thể phá vỡ mã T-SQL khi thay đổi thứ tự cột.
Carvellis

12
@Carvelis: bạn KHÔNG BAO GIỜ nên sử dụng INSERTmà không chỉ định rõ ràng các cột của mình!
marc_s

2
@marc_s: hoàn toàn có thể, nhưng tôi thường không phải là người duy nhất làm việc trong một dự án. Tôi đã thấy khá nhiều dự án mà mọi người đã sử dụng loại mã này.
Carvellis

30

Bạn phải liệt kê rõ ràng các trường theo thứ tự bạn muốn chúng được trả lại thay vì sử dụng * cho thứ tự 'mặc định'.

truy vấn ban đầu:

select * from foobar

trả lại

foo bar
--- ---
  1   2

bây giờ viết

select bar, foo from foobar

bar foo
--- ---
  2   1

Câu trả lời trên là sai phải không? Câu trả lời này thực sự chỉ ra cách sắp xếp thứ tự các cột, tại sao cái trước có dấu kiểm còn cái này thì không?
Đặc vụ Lu

1
@Agent Lu Vấn đề là từ ngữ của câu hỏi ban đầu. Marc và tôi đã giải thích câu hỏi của OP về 'thay đổi thứ tự của các cột' theo cách khác nhau. Anh ấy đưa ra lập luận chặt chẽ tại sao thứ tự cột không liên quan trong bảng được lưu trữ (mặc dù vậy, tên là vậy). Tôi đã chỉ ra cách dữ liệu có thể được trích xuất theo một thứ tự cột khác. Không giống chút nào!
lexu

23

theo http://msdn.microsoft.com/en-us/library/aa337556.aspx

Tác vụ này không được hỗ trợ bằng cách sử dụng câu lệnh Transact-SQL.

Vâng, nó có thể được thực hiện, bằng cách sử dụng create/ copy / drop/ rename, như được trả lời bởi komma8.komma1

Hoặc bạn có thể sử dụng SQL Server Management Studio

  1. Trong Object Explorer , nhấp chuột phải vào bảng có các cột bạn muốn sắp xếp lại và nhấp vào Thiết kế (Sửa đổi trong phiên bản 2005 SP1 hoặc cũ hơn)
  2. Chọn hộp ở bên trái của tên cột mà bạn muốn sắp xếp lại. (Bạn có thể chọn nhiều cột bằng cách giữ phím [shift] hoặc [ctrl] trên bàn phím của mình.)
  3. Kéo (các) cột đến một vị trí khác trong bảng.

Sau đó bấm lưu. Phương pháp này thực sự giảm và tạo lại bảng, vì vậy một số lỗi có thể xảy ra.

Nếu tùy chọn Theo dõi Thay đổi được bật cho cơ sở dữ liệu và bảng, bạn không nên sử dụng phương pháp này.

Nếu nó bị tắt, tùy chọn Ngăn lưu thay đổi yêu cầu tạo lại bảng sẽ bị xóa trong menu Công cụ> Tùy chọn> Nhà thiết kế, nếu không sẽ xảy ra lỗi "Không cho phép lưu thay đổi" .

  • Việc tắt tùy chọn Ngăn lưu thay đổi yêu cầu tùy chọn tạo lại bảng được Microsoft khuyến cáo không nên vì nó dẫn đến việc thông tin theo dõi thay đổi hiện có bị xóa khi bảng được tạo lại, vì vậy bạn không bao giờ được tắt tùy chọn này nếu Theo dõi thay đổi được kích hoạt!

Các vấn đề cũng có thể phát sinh trong quá trình tạo khóa chính và khóa ngoài.

Nếu bất kỳ lỗi nào ở trên xảy ra, việc lưu không thành công khiến bạn có thứ tự cột ban đầu.


1
Câu lệnh " This task cannot be performed using Transact-SQL statements." trong tài liệu đã sai. Tôi đã giải thích tác giả và yêu cầu anh ta đổi nó thành " This task is not supported using Transact-SQL statements.". Khoảng một ngày trước, tác giả đã đồng ý và tài liệu đã được sửa. Bạn có thể theo dõi cuộc thảo luận mà chúng tôi đã có trên GitHub .
Ronen Ariely

@Ronen Rất tốt, và cảm ơn vì đã cho tôi biết. Tôi đã cập nhật câu trả lời của mình
robotik

Bạn được hoan nghênh nhất @robotik 😀. Tôi hy vọng rằng tất cả những người đến đây và xem phản hồi với nhiều phiếu bầu nhất sẽ hiểu rằng đó là một sai lầm hoàn toàn. Thật không may, Cộng đồng thường cư xử như một bầy (gia súc) và một khi người lãnh đạo và người đóng góp hàng đầu (người được coi là chuyên gia hàng đầu) trong cộng đồng mắc lỗi, thì những người khác sẽ làm theo anh ta, như đã xảy ra trong chuỗi này. Mọi người tiếp tục bỏ phiếu cho một sai lầm nếu nó đã nhận được nhiều phiếu bầu (cách tiếp cận của: "vì mọi người đều nói như vậy, sau đó nó là sự thật") và những người khác sẽ đến diễn đàn sẽ nghĩ rằng đây là câu trả lời chính xác.
Ronen Ariely

1
@RonenAriely đó là lý do tại sao tôi luôn luôn cuộn xuống :)
robotik

13

Điều này tương tự như câu hỏi về sắp xếp thứ tự các bản ghi trong kết quả của một truy vấn .. và thường không ai thích câu trả lời chính thức ;-)

Vì vậy, ở đây nó đi:

  • theo tiêu chuẩn SQL, các cột trong bảng không được "sắp xếp"
  • do đó, a select *không buộc các cột được trả về theo một thứ tự cụ thể
  • thông thường, mỗi RDBMS có một loại thứ tự "mặc định" (thường là thứ tự mà các cột được thêm vào bảng, hoặc trong create table' or in thebảng thay đổi, hãy thêm câu lệnh `
  • do đó, nếu bạn dựa vào thứ tự của các cột (vì bạn đang sử dụng kết quả của một truy vấn để lấy một số cơ cấu dữ liệu khác từ vị trí của các cột), hãy liệt kê rõ ràng các cột theo thứ tự bạn muốn.

11

Tất nhiên, bạn có thể thay đổi thứ tự của các cột trong câu lệnh sql. Tuy nhiên, nếu bạn muốn tóm tắt thứ tự cột vật lý của bảng, bạn có thể tạo một dạng xem. I E

CREATE TABLE myTable(
    a int NULL,
    b varchar(50) NULL,
    c datetime NULL
);


CREATE VIEW vw_myTable
AS
SELECT c, a, b
  FROM myTable;

select * from myTable;
a  b  c
-  -  -

select * from vw_myTable
c  a  b
-  -  -

điều này có thay đổi thời gian truy vấn không?
Blindguy

@blindguy không, nó không thay đổi thời gian truy vấn của bạn
mevdiven 29/02/16

9

Trong SQLServer Management Studio:

Công cụ -> Tùy chọn -> Nhà thiết kế -> Nhà thiết kế Bảng và Cơ sở dữ liệu

  • Bỏ chọn 'Ngăn lưu các thay đổi yêu cầu tạo lại bảng'.

Sau đó:

  • nhấp chuột phải vào bảng bạn muốn sắp xếp lại các cột.
  • nhấp vào 'Thiết kế'.
  • Kéo các cột theo thứ tự bạn muốn.
  • cuối cùng, nhấp vào lưu.

SQLServer Management studio sẽ thả bảng và tạo lại nó bằng cách sử dụng dữ liệu.


6

Bạn có thể làm điều đó bằng cách tạo một bảng mới, sao chép tất cả dữ liệu, bỏ bảng cũ, sau đó đổi tên bảng mới để thay thế bảng cũ.

Bạn cũng có thể thêm các cột mới vào bảng, sao chép dữ liệu từng cột qua từng cột, bỏ các cột cũ, sau đó đổi tên các cột mới để khớp với các cột cũ. Một ví dụ đơn giản bên dưới: http://sqlfiddle.com/#!3/67af4/1

CREATE TABLE TestTable (
    Column1 INT,
    Column2 VARCHAR(255)
);
GO

insert into TestTable values(1, 'Test1');
insert into TestTable values(2, 'Test2');
GO

select * from TestTable;
GO

ALTER TABLE TestTable ADD Column2_NEW VARCHAR(255);
ALTER TABLE TestTable ADD Column1_NEW INT;
GO

update TestTable 
set Column1_NEW = Column1, 
    Column2_NEW = Column2;
GO

ALTER TABLE TestTable DROP COLUMN Column1;
ALTER TABLE TestTable DROP COLUMN Column2;
GO

sp_rename 'TestTable.Column1_NEW', 'Column1', 'COLUMN';
GO
sp_rename 'TestTable.Column2_NEW', 'Column2', 'COLUMN';
GO

select * from TestTable;
GO

1
tôi đã viết một thủ tục được lưu trữ để làm điều gì đó tương tự. Nó tự động hóa việc xây dựng lại bảng bằng cách sử dụng SQL động. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer

6

Trong SQLServer Management Studio:

Tools-> Options-> Designers->Table and Database Designers

Bỏ chọn Prevent saving changes that require table re-creation.

Bây giờ bạn có thể sắp xếp lại bảng.


2

Máy chủ Sql xây dựng kịch bản nội bộ. Nó tạo một bảng tạm thời với các thay đổi mới và sao chép dữ liệu và thả bảng hiện tại sau đó tạo lại bảng chèn từ bảng tạm thời. Tôi tìm thấy nó từ ssms tùy chọn "Generate Change script" 2014. Tập lệnh như thế này. Từ đây: Cách thay đổi thứ tự cột trong bảng bằng truy vấn sql

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_emps
    (
    id int NULL,
    ename varchar(20) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_emps SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.emps)
     EXEC('INSERT INTO dbo.Tmp_emps (id, ename)
        SELECT id, ename FROM dbo.emps WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.emps
GO
EXECUTE sp_rename N'dbo.Tmp_emps', N'emps', 'OBJECT' 
GO
COMMIT

1

Nếu bảng của bạn có đủ cột thì bạn có thể thử cách này. Đầu tiên, hãy tạo một bảng mới với thứ tự các cột được ưu tiên.

    create table new as select column1,column2,column3,....columnN from table_name;

Bây giờ thả bảng bằng lệnh thả

    drop table table_name;

bây giờ đổi tên bảng mới tạo thành tên bảng cũ của bạn.

    rename new to table_name;

bây giờ hãy chọn bảng, bạn đã sắp xếp lại các cột như bạn muốn trước đây.

    select * from table_name;

Điều này cũng giống như tạo một bảng mới, sao chép dữ liệu từ bảng hiện có sang bảng mới, xóa bảng cũ và đổi tên bảng mới. Vì vậy, nói chính xác, đây không phải là thay đổi thứ tự cột của bảng. Vì điều này tạo / sao chép từ bảng cũ, mất thời gian cho các bảng lớn. Cuối cùng nhưng không kém phần quan trọng, cú pháp được đề xuất không hoạt động trong t-sql.
Jean-François

0

Vào cuối ngày, bạn không thể thực hiện điều này trong MS SQL. Gần đây tôi đã tạo bảng khi đang di chuyển (khởi động ứng dụng) bằng Thủ tục được lưu trữ đọc từ bảng tra cứu. Khi tôi tạo một dạng xem kết hợp những bảng này với một bảng khác mà tôi đã tạo trước đó theo cách thủ công (cùng một lược đồ, với dữ liệu), Nó không thành công - đơn giản vì tôi đang sử dụng '' Chọn * UNION Chọn * 'cho chế độ xem. Đồng thời, nếu tôi chỉ sử dụng những thứ được tạo thông qua thủ tục được lưu trữ, thì tôi đã thành công.

Kết luận: Nếu có bất kỳ ứng dụng nào phụ thuộc vào thứ tự của cột thì đó thực sự là chương trình không tốt và chắc chắn sẽ tạo ra các vấn đề trong tương lai. Các cột nên 'thoải mái' ở bất kỳ đâu và được sử dụng cho bất kỳ quá trình dữ liệu nào (CHÈN, CẬP NHẬT, CHỌN).


0

Bạn có thể đạt được nó với các bước sau:

  1. loại bỏ tất cả các khóa ngoại và khóa chính của bảng gốc.

  2. đổi tên bảng gốc.

  3. sử dụng CTAS tạo bảng gốc theo thứ tự bạn muốn.

  4. bỏ bàn cũ.

  5. áp dụng tất cả các ràng buộc trở lại bảng ban đầu


0

Nếu các cột được sắp xếp lại gần đây đã được tạo và trống, thì các cột có thể được xóa và thêm lại theo đúng thứ tự.

Điều này đã xảy ra với tôi, mở rộng cơ sở dữ liệu theo cách thủ công để thêm chức năng mới, và tôi đã bỏ sót một cột và khi tôi thêm nó, trình tự không chính xác.

Sau khi không tìm thấy giải pháp thích hợp ở đây, tôi chỉ cần sửa lại bảng bằng cách sử dụng các loại lệnh sau.

ALTER TABLE  tablename  DROP COLUMN  columnname; 
ALTER TABLE  tablename  ADD columnname columntype;

Lưu ý: chỉ thực hiện việc này nếu bạn không có dữ liệu trong các cột mà bạn đang loại bỏ.

Mọi người đã nói rằng thứ tự cột không quan trọng. Tôi thường xuyên sử dụng SQL Server Management Studio "tạo tập lệnh" để tạo phiên bản văn bản của lược đồ cơ sở dữ liệu. Để kiểm soát phiên bản một cách hiệu quả các tập lệnh này (git) và so sánh chúng (WinMerge), bắt buộc đầu ra từ các cơ sở dữ liệu tương thích phải giống nhau và sự khác biệt được đánh dấu là sự khác biệt về cơ sở dữ liệu chính hãng.

Thứ tự cột không quan trọng; nhưng chỉ với một số người, không phải cho tất cả mọi người!


0

Tôi cho rằng bạn muốn thêm một cột mới vào một vị trí cụ thể. Bạn có thể tạo một cột mới bằng cách di chuyển các cột hiện tại sang bên phải.

+---+---+---+
| A | B | C |
+---+---+---+

Xóa tất cả các chỉ mục bị ảnh hưởng và các tham chiếu khóa ngoại. Thêm một cột mới có cùng kiểu dữ liệu chính xác như cột cuối cùng và sao chép dữ liệu vào đó.

+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
          |___^

Thay đổi kiểu dữ liệu của cột thứ ba thành cùng kiểu như cột trước đó và sao chép dữ liệu vào đó.

+---+---+---+---+
| A | B | B | C | 
+---+---+---+---+
      |___^

Đổi tên các cột cho phù hợp, tạo lại các chỉ mục đã loại bỏ và các tham chiếu khóa ngoại.

+---+---+---+---+
| A | D | B | C | 
+---+---+---+---+

Thay đổi kiểu dữ liệu của cột thứ hai.

Hãy nhớ rằng thứ tự cột chỉ là một thứ "thẩm mỹ" như marc_s đã nói .


-1

Sử dụng

SELECT * FROM TABLE1

hiển thị thứ tự cột mặc định của bảng.

Nếu bạn muốn thay đổi thứ tự của các cột.

Chỉ định tên cột để hiển thị tương ứng

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1

Câu hỏi không phải là đặt hàng tạm thời. Câu hỏi là về cấu trúc thiết kế bảng khi bạn thay đổi bảng và thêm các cột mới.
vikas Chaturvedi

-1

bạn có thể sử dụng lập chỉ mục .. Sau khi lập chỉ mục, nếu chọn * từ XXXX kết quả phải theo chỉ mục, Nhưng chỉ tập hợp kết quả .. không phải cấu trúc của Bảng


-1

Bạn có thể thay đổi điều này bằng cách sử dụng truy vấn SQL. Đây là truy vấn sql để thay đổi trình tự của cột.

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;

Tôi tự hỏi nếu điều này giảm xuống và tạo lại bảng như trong SSMS. Dù bằng cách nào, tôi sẽ không tung xúc xắc làm điều này trên DB sản xuất, mặc dù phương pháp này có vẻ thú vị và đáng để một số người tham khảo.
samis

Chức năng này không hoạt động trong SQL Server như đã được OP chỉ định. Ước gì nó đã làm.
Bill

1
Đây là cú pháp MySQL, không phải SQL Server.
Jon Schneider

-1

Để có thứ tự cột cụ thể Bạn cần chọn từng cột theo thứ tự Bạn muốn. Thứ tự lựa chọn cho biết các cột sẽ được sắp xếp như thế nào trong đầu ra.


-1

Hãy thử lệnh này:

alter table students modify age int(5) first; 

Điều này sẽ thay đổi vị trí của tuổi thành vị trí đầu tiên.


Đây không phải là SQL hợp lệ trong MSSQL. Có lẽ MySQL hoặc một số phương ngữ khác, nhưng không phải cho SQL Server 2005
nsimeonov

-2

thay đổi tên bảng sửa đổi tên cột int (5) đầu tiên; sẽ đưa cột về tên bảng thay đổi đầu tiên, sửa đổi tên cột int (5) sau (tên bảng);


-3

Ví dụ: Thay đổi vị trí của field_price sau field_price trong trạng thái bảng.

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;

2
Đây là cú pháp MySQL, không phải SQL Server.
Jon Schneider
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.