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.
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.
Câu trả lời:
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 TABLE
lệ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.
INSERT
mà không chỉ định rõ ràng các cột của mình!
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
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
- 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)
- 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.)
- 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" .
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.
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 .
Đ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:
select *
không buộc các cột được trả về theo một thứ tự cụ thểcreate table' or in the
bảng thay đổi, hãy thêm câu lệnh `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
- - -
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
Sau đó:
SQLServer Management studio sẽ thả bảng và tạo lại nó bằng cách sử dụng dữ liệu.
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
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.
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
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;
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).
Bạn có thể đạt được nó với các bước sau:
loại bỏ tất cả các khóa ngoại và khóa chính của bảng gốc.
đổi tên bảng gốc.
sử dụng CTAS tạo bảng gốc theo thứ tự bạn muốn.
bỏ bàn cũ.
áp dụng tất cả các ràng buộc trở lại bảng ban đầu
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!
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 .
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
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`;
Để 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.
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.
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);
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`;