ฉันสามารถเรียงลำดับคอลัมน์ในตารางใหม่อย่างมีเหตุผลได้หรือไม่


94

ถ้าฉันกำลังเพิ่มคอลัมน์ลงในตารางใน Microsoft SQL Server ฉันจะควบคุมตำแหน่งที่จะแสดงคอลัมน์ในแบบสอบถามได้หรือไม่

ฉันไม่ต้องการยุ่งกับรูปแบบทางกายภาพของคอลัมน์บนดิสก์ แต่ฉันต้องการจัดกลุ่มคอลัมน์อย่างมีเหตุผลเข้าด้วยกันเมื่อเป็นไปได้เพื่อให้เครื่องมือเช่น SQL Server Management Studio แสดงรายการเนื้อหาของตารางในวิธีที่สะดวก

ฉันรู้ว่าฉันสามารถทำได้ผ่าน SQL Management Studio โดยไปที่โหมด "ออกแบบ" สำหรับตารางแล้วลากลำดับของคอลัมน์ไปรอบ ๆ แต่ฉันต้องการที่จะทำใน SQL ดิบเพื่อที่ฉันจะสามารถดำเนินการสั่งซื้อได้ สคริปต์จากบรรทัดคำสั่ง


สายเกินไปสำหรับคำตอบ แต่ลองดูที่ลิงค์นี้ blog.sqlauthority.com/2013/03/11/…
sqluser


สิ่งที่เกี่ยวข้องเพิ่มเติม: stackoverflow.com/questions/34818/…และdba.stackexchange.com/questions/18719/…
Tim Abell

และอีกคำถามที่เกี่ยวข้องว่ามันมีความสำคัญหรือไม่stackoverflow.com/questions/6692021/…
Tim Abell

microsoft connect: เปลี่ยนไวยากรณ์ของตารางสำหรับการเปลี่ยนลำดับคอลัมน์ - การตอบสนองเป็นของกาน้ำชาช็อคโกแลตตามปกติ WONTFIX
Tim Abell

คำตอบ:


79

คุณไม่สามารถดำเนินการตามโปรแกรมได้ (ด้วยวิธีที่ปลอดภัย) โดยไม่ต้องสร้างตารางใหม่

สิ่งที่ Enterprise Manager ทำเมื่อคุณยืนยันการจัดลำดับใหม่คือการสร้างตารางใหม่ย้ายข้อมูลจากนั้นลบตารางเก่าและเปลี่ยนชื่อตารางใหม่เป็นชื่อที่มีอยู่

หากคุณต้องการให้คอลัมน์ของคุณอยู่ในลำดับ / การจัดกลุ่มเฉพาะโดยไม่ต้องเปลี่ยนลำดับทางกายภาพคุณสามารถสร้างมุมมองที่สามารถเป็นอะไรก็ได้ที่คุณต้องการ


43

ฉันคิดว่าสิ่งที่ทุกคนที่นี่ขาดหายไปก็คือแม้ว่าทุกคนจะไม่ต้องรับมือกับอินสแตนซ์ 10, 20 หรือ 1,000 ของระบบซอฟต์แวร์เดียวกันที่ติดตั้งทั่วประเทศและทั่วโลก ... พวกเราที่ออกแบบซอฟต์แวร์ขายในเชิงพาณิชย์ก็ทำเช่นนั้น ด้วยเหตุนี้เราจึงขยายระบบเมื่อเวลาผ่านไปขยายตารางโดยการเพิ่มฟิลด์ตามความสามารถใหม่ ๆ และเนื่องจากฟิลด์เหล่านั้นถูกระบุว่าอยู่ในตารางที่มีอยู่ดังนั้นกว่าทศวรรษของการขยายการเติบโตการเพิ่มฟิลด์ ฯลฯ เป็นตาราง .... จากนั้นต้องทำงานกับตารางเหล่านั้นตั้งแต่การออกแบบการสนับสนุนไปจนถึงบางครั้งการขุดลงในข้อมูลดิบ / การแก้ไขปัญหาเพื่อแก้ไขข้อบกพร่องของฟังก์ชันการทำงานใหม่ .... เป็นการซ้ำเติมอย่างไม่น่าเชื่อที่จะไม่มีข้อมูลหลักที่คุณต้องการ ดูภายในฟิลด์แรก ๆ

บ่อยครั้งที่ฉันหวังว่าจะทำได้ด้วยเหตุผลที่แท้จริงนี้ แต่ขาดการทำสิ่งที่ SQL ทำอย่างแท้จริงการสร้าง Create Script สำหรับตารางใหม่ในแบบที่ฉันต้องการเขียนแทรกลงไปจากนั้นทิ้งข้อ จำกัด ความสัมพันธ์คีย์ดัชนี ฯลฯ ที่มีอยู่ทั้งหมดออกจากตารางที่มีอยู่และเปลี่ยนชื่อ ตาราง "ใหม่" กลับไปที่ชื่อเก่าจากนั้นอ่านคีย์ความสัมพันธ์ดัชนี ฯลฯ ฯลฯ ....

ไม่เพียง แต่น่าเบื่อใช้เวลานาน แต่ ... อีกห้าปีจะต้องเกิดขึ้นอีกครั้ง ....

มันใกล้จะคุ้มค่ากับการทำงานจำนวนมหาศาลอย่างไรก็ตามประเด็นก็คือ ... มันจะไม่ใช่ครั้งสุดท้ายที่เราต้องการความสามารถนี้เนื่องจากระบบของเราจะเติบโตขยายและได้รับเขตข้อมูลตามลำดับที่ขับเคลื่อนโดย ต้องการ / ออกแบบเพิ่มเติม

นักพัฒนาส่วนใหญ่คิดจากมุมมองของระบบเดียวที่ให้บริการ บริษัท เดียวหรือตลาด Hard Box ที่เฉพาะเจาะจงมาก

นักออกแบบและผู้นำการพัฒนาที่มีความก้าวหน้าอย่างมีนัยสำคัญในพื้นที่ตลาดมักจะต้องจัดการกับปัญหานี้ซ้ำแล้วซ้ำเล่า ..... จะชอบวิธีแก้ปัญหาที่สร้างสรรค์หากมี สิ่งนี้สามารถช่วย บริษัท ของฉันสัปดาห์ละโหลได้อย่างง่ายดายเพียงแค่ไม่ต้องเลื่อนดูหรือจำว่าฟิลด์ "นั้น" อยู่ที่ไหนในตารางข้อมูลต้นทาง ....


เราประสบปัญหาเดียวกันและสร้างกระบวนงานที่จัดเก็บไว้ซึ่งทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ (เปลี่ยนชื่อสร้างตารางใหม่คัดลอกสร้างคีย์แปลกปลอมทั้งหมดข้อ จำกัด ฯลฯ ) คุณต้องส่งในชื่อตารางและลำดับคอลัมน์ใหม่เท่านั้น หากสิ่งนี้สามารถช่วย บริษัท ของคุณได้หลายสิบชั่วโมงต่อสัปดาห์คุณควรลงทุนเวลาในการเขียนสคริปต์ที่คล้ายกัน สำหรับเราใช้เวลาประมาณ 2-3 วันในการสร้างสคริปต์ที่เสถียรซึ่งเราใช้เป็นประจำในการเรียงลำดับคอลัมน์ใหม่ ดูแลคุณลักษณะทั้งหมดที่เราใช้ใน SqlServer (เช่นดัชนีบางส่วนมุมมองที่จัดทำดัชนี ฯลฯ ) และประกอบด้วย LOC ประมาณ 400 รายการเท่านั้น
Andreas

1
ฉันไม่รู้ว่าทำไมพวกเขาไม่สามารถแยกเค้าโครงคอลัมน์ออกไปได้ ไม่จำเป็นต้องเรียงลำดับคอลัมน์ใหม่! จำนวนระดับ PHD และนอกเหนือจากวิศวกรรมใน Sql Server นั้นน่าอัศจรรย์อย่างแท้จริง เมื่อคุณพิจารณาความซับซ้อนของการสร้างแผนแบบสอบถามสถิติการจัดทำดัชนีและยังไม่มีใครยืนขึ้นและพูดว่า 'ให้สร้างตารางที่แสดงถึงลำดับตรรกะ FieldID Guid, OrderBy int. เสร็จแล้ว จากนั้น SSMS หรือSELECT *ใช้สิ่งนั้น ปิดถ้าคุณเป็น DBA ที่สมบูรณ์แบบและไม่ต้องการ น่าผิดหวังมาก และตอนนี้โต๊ะของฉันใหญ่พอที่ฉันจะไม่สามารถบังคับมันได้อีกต่อไป
Simon_Weaver

ฉันรู้ว่านี่เป็นความคิดเห็นเก่า แต่สตูดิโอภาพภายในโครงการฐานข้อมูลจะสร้างสคริปต์ SQL สำหรับการเรียงลำดับคอลัมน์ทางกายภาพโดยอัตโนมัติเมื่อคุณเปลี่ยนสคีมาของตารางและกดเผยแพร่
Muflix

5

ถ้าฉันเข้าใจคำถามของคุณคุณต้องการให้มีผลกับคอลัมน์ใดที่จะส่งคืนก่อนสองสาม ฯลฯ ในการสืบค้นที่มีอยู่ใช่ไหม

หากข้อความค้นหาทั้งหมดของคุณเขียนด้วยSELECT * FROM TABLE- จากนั้นจะปรากฏในผลลัพธ์ตามที่ระบุไว้ใน SQL

หากข้อความค้นหาของคุณเขียนด้วยSELECT Field1, Field2 FROM TABLE- ดังนั้นลำดับที่วางไว้ใน SQL จะไม่สำคัญ


3

เมื่อ Management Studio ดำเนินการดังกล่าวจะเป็นการสร้างตารางชั่วคราวคัดลอกทุกอย่างทิ้งตารางเดิมของคุณและเปลี่ยนชื่อตารางชั่วคราว ไม่มีคำสั่ง T-SQL ที่เทียบเท่าง่ายๆ

หากคุณไม่อยากทำเช่นนั้นคุณสามารถสร้างมุมมองของตารางด้วยคอลัมน์ตามลำดับที่คุณต้องการและใช้สิ่งนั้นได้เสมอ?

แก้ไข: ทุบตี!


1

มีอยู่วิธีหนึ่ง แต่เป็นการค้นหาชั่วคราวเท่านั้น ตัวอย่างเช่น,

สมมติว่าคุณมี 5 โต๊ะ ตารางเรียกว่าT_Testing

FirstName, LastName, PhoneNumber, Email และ Member_ID

คุณต้องการให้แสดง ID ของพวกเขาจากนั้นนามสกุลตามด้วย FirstName จากนั้นโทรศัพท์และอีเมล

คุณสามารถทำได้ตาม Select

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

นอกเหนือจากนั้นหากคุณต้องการให้ LastName แสดงก่อนชื่อด้วยเหตุผลบางประการคุณสามารถทำได้ดังนี้:

Select LastName, *
From T_Testing

สิ่งเดียวที่คุณต้องการให้แน่ใจว่าคุณทำคือฟังก์ชัน OrderBy หรือ Where จะต้องแสดงเป็นตารางคอลัมน์ถ้าคุณจะใช้ Where หรือ OrderBy

ตัวอย่าง:

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

ฉันหวังว่านี่จะช่วยได้ฉันคิดออกเพราะฉันต้องทำด้วยตัวเอง


ในแบบสอบถามนี้เลือก LastName * จาก T_Testing คุณจะได้รับ LastName สองครั้ง
sqluser

1
  1. เขียนสคริปต์ตารางที่มีอยู่ของคุณไปยังหน้าต่างแบบสอบถาม
  2. เรียกใช้สคริปต์นี้กับฐานข้อมูลทดสอบ (ลบคำสั่ง Use)
  3. ใช้ SSMS เพื่อทำการเปลี่ยนแปลงคอลัมน์ที่คุณต้องการ
  4. คลิกสร้างสคริปต์การเปลี่ยนแปลง (ไอคอนซ้ายสุดและล่างสุดบนแถบปุ่มโดยค่าเริ่มต้น)
  5. ใช้สคริปต์นี้กับตารางจริงของคุณ

สคริปต์ทั้งหมดทำได้จริง ๆ คือสร้างตารางตารางที่สองพร้อมคำสั่งคอลัมน์ที่ต้องการคัดลอกข้อมูลทั้งหมดของคุณลงในตารางวางตารางเดิมแล้วเปลี่ยนชื่อตารางรองเพื่อใช้แทน ซึ่งจะช่วยให้คุณไม่ต้องเขียนมันด้วยตัวเองแม้ว่าคุณจะต้องการสคริปต์ปรับใช้


0

สามารถทำได้โดยใช้ SQL โดยการปรับเปลี่ยนตารางระบบโดยตรง ตัวอย่างเช่นดูที่นี่:

แก้ไขตาราง - เพิ่มคอลัมน์ใหม่ระหว่าง

อย่างไรก็ตามฉันไม่แนะนำให้เล่นกับตารางระบบเว้นแต่ว่าจำเป็นจริงๆ


0

ไม่สามารถเปลี่ยนลำดับของคอลัมน์ได้โดยไม่ต้องสร้างทั้งตารางใหม่ หากคุณมีเพียงไม่กี่อินสแตนซ์ของฐานข้อมูลเท่านั้นคุณสามารถใช้ SSMS สำหรับสิ่งนี้ได้ (เลือกตารางและคลิก "ออกแบบ")

ในกรณีที่คุณมีอินสแตนซ์มากเกินไปสำหรับกระบวนการด้วยตนเองคุณควรลองใช้สคริปต์นี้: https://github.com/Epaminaidos/reorder-columns

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.