วิธีการเปลี่ยนลำดับคอลัมน์ในตารางโดยใช้แบบสอบถาม SQL ใน SQL Server 2005
ฉันต้องการจัดเรียงลำดับคอลัมน์ในตารางใหม่โดยใช้แบบสอบถาม SQL
วิธีการเปลี่ยนลำดับคอลัมน์ในตารางโดยใช้แบบสอบถาม SQL ใน SQL Server 2005
ฉันต้องการจัดเรียงลำดับคอลัมน์ในตารางใหม่โดยใช้แบบสอบถาม SQL
คำตอบ:
คุณไม่สามารถ. ลำดับคอลัมน์เป็นเพียง "เครื่องสำอาง" ที่มนุษย์เราสนใจ - สำหรับ SQL Server มันแทบจะไม่เกี่ยวข้องกันเลย
สิ่งที่สตูดิโอจัดการเซิร์ฟเวอร์ SQL ทำในพื้นหลังเมื่อคุณเปลี่ยนลำดับคอลัมน์มีการสร้างตารางใหม่ตั้งแต่ต้นด้วยCREATE TABLEคำสั่งใหม่คัดลอกข้อมูลจากตารางเก่าจากนั้นจึงวางลง
ไม่มีคำสั่ง SQL เพื่อกำหนดการจัดลำดับคอลัมน์
INSERTโดยไม่ระบุคอลัมน์ของคุณอย่างชัดเจนอีกต่อไป!
                    คุณต้องแสดงรายการฟิลด์ตามลำดับที่คุณต้องการให้ส่งคืนอย่างชัดเจนแทนที่จะใช้ * สำหรับคำสั่ง 'ค่าเริ่มต้น'
คำถามเดิม:
select * from foobarผลตอบแทน
foo bar
--- ---
  1   2ตอนนี้เขียน
select bar, foo from foobar
bar foo
--- ---
  2   1อ้างอิงจากhttp://msdn.microsoft.com/en-us/library/aa337556.aspx
งานนี้ไม่ได้รับการสนับสนุนโดยใช้คำสั่ง Transact-SQL
สามารถทำได้โดยใช้create/ copy / drop/ rename ตามที่komma8.komma1ตอบ
หรือคุณสามารถใช้ SQL Server Management Studio
- ในObject Explorerให้คลิกขวาที่ตารางที่มีคอลัมน์ที่คุณต้องการจัดลำดับใหม่แล้วคลิกออกแบบ (ปรับเปลี่ยนในเวอร์ชัน 2005 SP1 หรือรุ่นก่อนหน้า)
- เลือกช่องทางด้านซ้ายของชื่อคอลัมน์ที่คุณต้องการจัดลำดับใหม่ (คุณสามารถเลือกหลายคอลัมน์ได้โดยกดปุ่ม [shift] หรือ [ctrl] บนแป้นพิมพ์ของคุณ)
- ลากคอลัมน์ไปยังตำแหน่งอื่นภายในตาราง
จากนั้นคลิกบันทึก วิธีนี้จะลดลงและสร้างตารางใหม่ดังนั้นข้อผิดพลาดบางอย่างอาจเกิดขึ้น
ถ้าเปิดใช้งานตัวเลือกChange Trackingสำหรับฐานข้อมูลและตารางคุณไม่ควรใช้วิธีนี้
หากปิดใช้งานตัวเลือกป้องกันการบันทึกการเปลี่ยนแปลงที่ต้องใช้ตัวเลือกการสร้างตารางใหม่ควรถูกล้างในเมนูเครื่องมือ> ตัวเลือก> นักออกแบบมิฉะนั้นจะเกิดข้อผิดพลาด"ไม่อนุญาตให้บันทึกการเปลี่ยนแปลง"
ปัญหาอาจเกิดขึ้นระหว่างการสร้างคีย์หลักและคีย์ต่างประเทศ
หากข้อผิดพลาดใด ๆ ข้างต้นเกิดขึ้นการบันทึกจะล้มเหลวซึ่งจะทำให้คุณมีลำดับคอลัมน์เดิม
This task cannot be performed using Transact-SQL statements." ในเอกสารไม่ถูกต้อง ฉันอธิบายผู้เขียนและขอให้เขาเปลี่ยนเป็น " This task is not supported using Transact-SQL statements." ประมาณหนึ่งวันที่ผ่านมาผู้เขียนเห็นด้วยและเอกสารได้รับการแก้ไข คุณสามารถทำตามการสนทนาที่เรามีอยู่บน GitHub
                    คำถามนี้คล้ายกับคำถามเกี่ยวกับการจัดลำดับระเบียนในผลลัพธ์ของแบบสอบถาม .. และโดยทั่วไปแล้วไม่มีใครชอบคำตอบที่ถูกต้องอย่างเป็นทางการ ;-)
นี่คือ:
select *จึงไม่บังคับให้ส่งคืนคอลัมน์ตามลำดับเฉพาะcreate table' or in theตารางแก้ไขเพิ่มคำสั่ง "แน่นอนคุณสามารถเปลี่ยนลำดับของคอลัมน์ในคำสั่ง sql อย่างไรก็ตามหากคุณต้องการเรียงลำดับคอลัมน์ทางกายภาพของตารางนามธรรมคุณสามารถสร้างมุมมองได้ กล่าวคือ
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
-  -  -ใน SQLServer Management Studio:
เครื่องมือ -> ตัวเลือก -> นักออกแบบ -> นักออกแบบตารางและฐานข้อมูล
จากนั้น:
SQLServer Management studio จะวางตารางและสร้างขึ้นใหม่โดยใช้ข้อมูล
คุณสามารถทำได้โดยสร้างตารางใหม่คัดลอกข้อมูลทั้งหมดวางตารางเก่าจากนั้นเปลี่ยนชื่อตารางใหม่เพื่อแทนที่ตารางเก่า
คุณยังสามารถเพิ่มคอลัมน์ใหม่ลงในตารางคัดลอกคอลัมน์ตามข้อมูลคอลัมน์วางคอลัมน์เก่าจากนั้นเปลี่ยนชื่อคอลัมน์ใหม่ให้ตรงกับคอลัมน์เก่า ตัวอย่างง่ายๆด้านล่าง: 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ใน SQLServer Management Studio:
Tools-> Options-> Designers->Table and Database Designers
Prevent saving changes that require table re-creationยกเลิกการเลือก
ตอนนี้คุณสามารถจัดลำดับตารางใหม่ได้
เซิร์ฟเวอร์ SQL สร้างสคริปต์ภายใน สร้างตารางชั่วคราวพร้อมการเปลี่ยนแปลงใหม่และคัดลอกข้อมูลและวางตารางปัจจุบันจากนั้นสร้างตารางแทรกใหม่จากตารางชั่วคราว หาได้จากตัวเลือก "Generate Change script" ssms 2014 สคริปต์แบบนี้ จากที่นี่: วิธีเปลี่ยนลำดับคอลัมน์ในตารางโดยใช้แบบสอบถาม 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หากตารางของคุณมีคอลัมน์เพียงพอคุณสามารถลองสิ่งนี้ได้ ขั้นแรกให้สร้างตารางใหม่โดยมีลำดับคอลัมน์ที่ต้องการ
    create table new as select column1,column2,column3,....columnN from table_name;ตอนนี้วางตารางโดยใช้คำสั่ง drop
    drop table table_name;ตอนนี้เปลี่ยนชื่อตารางที่สร้างขึ้นใหม่เป็นชื่อตารางเก่าของคุณ
    rename new to table_name;ตอนนี้เลือกตารางคุณได้จัดเรียงคอลัมน์ใหม่ตามที่คุณต้องการก่อนหน้านี้
    select * from table_name;ในตอนท้ายของวันคุณไม่สามารถทำได้ใน MS SQL ฉันเพิ่งสร้างตารางขณะเดินทาง (การเริ่มต้นแอปพลิเคชัน) โดยใช้ขั้นตอนที่เก็บไว้ซึ่งอ่านจากตารางการค้นหา เมื่อฉันสร้างมุมมองที่รวมสิ่งเหล่านี้กับตารางอื่นที่ฉันได้สร้างขึ้นด้วยตนเองก่อนหน้านี้ (สคีมาเดียวกันกับข้อมูล) มันล้มเหลวเพราะฉันใช้ '' เลือก * UNION เลือก * 'สำหรับมุมมอง ในขณะเดียวกันถ้าฉันใช้เฉพาะสิ่งที่สร้างขึ้นผ่านขั้นตอนการจัดเก็บฉันก็ทำได้สำเร็จ
โดยสรุป: หากมีแอปพลิเคชันใด ๆ ที่ขึ้นอยู่กับลำดับของคอลัมน์แสดงว่าเป็นการเขียนโปรแกรมที่ไม่ดีและจะสร้างปัญหาในอนาคตอย่างแน่นอน คอลัมน์ควร 'รู้สึก' เป็นอิสระที่จะอยู่ที่ใดก็ได้และใช้สำหรับกระบวนการข้อมูลใด ๆ (INSERT, UPDATE, SELECT)
คุณสามารถบรรลุได้ด้วยขั้นตอนเหล่านี้:
ลบคีย์แปลกปลอมและคีย์หลักของตารางเดิมทั้งหมด
เปลี่ยนชื่อตารางเดิม
ใช้ CTAS สร้างตารางเดิมตามลำดับที่คุณต้องการ
วางโต๊ะเก่า
ใช้ข้อ จำกัด ทั้งหมดกลับไปที่ตารางเดิม
หากคอลัมน์ที่จะจัดเรียงใหม่เพิ่งถูกสร้างขึ้นและว่างเปล่าคุณสามารถลบคอลัมน์และเพิ่มใหม่ได้ตามลำดับที่ถูกต้อง
สิ่งนี้เกิดขึ้นกับฉันการขยายฐานข้อมูลด้วยตนเองเพื่อเพิ่มฟังก์ชันใหม่และฉันพลาดคอลัมน์ออกไปและเมื่อฉันเพิ่มเข้าไปลำดับก็ไม่ถูกต้อง
หลังจากไม่พบวิธีแก้ปัญหาที่เพียงพอฉันก็แก้ไขตารางโดยใช้คำสั่งประเภทต่อไปนี้
ALTER TABLE  tablename  DROP COLUMN  columnname; 
ALTER TABLE  tablename  ADD columnname columntype;หมายเหตุ: ทำได้เฉพาะในกรณีที่คุณไม่มีข้อมูลในคอลัมน์ที่คุณกำลังทิ้ง
มีคนบอกว่าลำดับคอลัมน์ไม่สำคัญ ฉันใช้ SQL Server Management Studio "สร้างสคริปต์" เป็นประจำเพื่อสร้างเวอร์ชันข้อความของสคีมาของฐานข้อมูล ในการควบคุมเวอร์ชันอย่างมีประสิทธิภาพสคริปต์เหล่านี้ (git) และเปรียบเทียบ (WinMerge) จำเป็นที่ผลลัพธ์จากฐานข้อมูลที่เข้ากันได้จะเหมือนกันและความแตกต่างที่เน้นคือความแตกต่างของฐานข้อมูลของแท้
ลำดับคอลัมน์มีความสำคัญ แต่สำหรับบางคนไม่ใช่ทุกคน!
ฉันคิดว่าคุณต้องการเพิ่มคอลัมน์ใหม่ในตำแหน่งเฉพาะ คุณสามารถสร้างคอลัมน์ใหม่ได้โดยย้ายคอลัมน์ปัจจุบันไปทางขวา
+---+---+---+
| A | B | C |
+---+---+---+ลบดัชนีที่ได้รับผลกระทบและการอ้างอิงคีย์ต่างประเทศทั้งหมด เพิ่มคอลัมน์ใหม่ที่มีประเภทข้อมูลเดียวกันเช่นคอลัมน์สุดท้ายและคัดลอกข้อมูลที่นั่น
+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
          |___^เปลี่ยนประเภทข้อมูลของคอลัมน์ที่สามเป็นประเภทเดียวกันเช่นคอลัมน์ก่อนหน้าและคัดลอกข้อมูลที่นั่น
+---+---+---+---+
| A | B | B | C | 
+---+---+---+---+
      |___^เปลี่ยนชื่อคอลัมน์ตามลำดับสร้างดัชนีที่ถูกลบและการอ้างอิงคีย์ต่างประเทศใหม่
+---+---+---+---+
| A | D | B | C | 
+---+---+---+---+เปลี่ยนชนิดข้อมูลของคอลัมน์ที่สอง
เก็บไว้ในใจว่าคำสั่งคอลัมน์ที่เป็นแค่ "เครื่องสำอาง" สิ่งที่เหมือนmarc_s กล่าวว่า
ใช้
SELECT * FROM TABLE1ซึ่งแสดงลำดับคอลัมน์เริ่มต้นของตาราง
หากคุณต้องการเปลี่ยนลำดับของคอลัมน์
ระบุชื่อคอลัมน์ที่จะแสดงตามลำดับ
SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1คุณสามารถใช้การจัดทำดัชนี .. หลังจากการจัดทำดัชนีหากเลือก * จาก XXXX ผลลัพธ์ควรเป็นไปตามดัชนี แต่ชุดผลลัพธ์เท่านั้น .. ไม่ใช่โครงสร้างของตาราง
คุณสามารถเปลี่ยนแปลงได้โดยใช้แบบสอบถาม SQL นี่คือแบบสอบถาม sql เพื่อเปลี่ยนลำดับของคอลัมน์
ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;เพื่อให้มีลำดับคอลัมน์เฉพาะคุณต้องเลือกคอลัมน์ทีละคอลัมน์ตามลำดับที่คุณต้องการ ลำดับการเลือกกำหนดว่าจะเรียงลำดับคอลัมน์อย่างไรในเอาต์พุต
ลองใช้คำสั่งนี้:
alter table students modify age int(5) first; สิ่งนี้จะเปลี่ยนตำแหน่งของอายุเป็นตำแหน่งแรก
แก้ไขชื่อตารางแก้ไขชื่อคอลัมน์ int (5) ก่อน; จะนำคอลัมน์ไปแก้ไขชื่อตารางครั้งแรกแก้ไขชื่อคอลัมน์ int (5) หลัง (tablename);
ตัวอย่าง: เปลี่ยนตำแหน่งของ field_priority หลังจาก field_price ในสถานะตาราง
ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;