เมื่อวานฉันรู้สึกหงุดหงิดกับฐานข้อมูลที่ไม่ประสานกัน ไลบรารีที่ใช้สำหรับการพัฒนาและการทดสอบไม่เหมือนกัน ในไลบรารีที่พัฒนาขึ้นนั้น กระบวนการจัดเก็บจะได้รับการอัปเดตบ่อยครั้ง บางครั้งแม้แต่โครงสร้างตารางก็เปลี่ยนไป
สิ่งนี้นำไปสู่ปัญหามากมาย ฉันไม่รู้ว่าปัญหาเฉพาะนั้นคืออะไร ซึ่งทำให้ฉันรู้สึกเขินอายมาก จู่ๆ ฉันก็อยากจะเขียนโปรแกรมเพื่อเปรียบเทียบความแตกต่างระหว่างไลบรารีทั้งสองเพื่ออำนวยความสะดวกในการทดสอบและการใช้งาน
เช้านี้ฉันเขียนข้อความขณะประชุม และผ่านการทดสอบตอนเที่ยง
โดยหลักๆ แล้วมีคำสั่ง SQL สองคำสั่ง:
SQL ที่มีโครงสร้างตารางและมุมมองที่แตกต่างกันและแอตทริบิวต์คอลัมน์ในไลบรารีแบบสอบถามมีดังนี้:
เลือก A. [ชื่อ] เป็น TableName
B. [ชื่อ] เป็น Colname
B.xtype,
B.xusertype,
B.ความยาว
บี.โคลิด,
B.cdefault,
บี.โดเมน
ข.หมายเลข
B.ชดเชย
B.สถานะ
ข.ประเภท
B.ประเภทผู้ใช้,
บี.เพร็ค,
B.สเกล,
B. คำนวณไม่ได้
บ.ไอสุทพาราม,
ข.เป็นโมฆะไม่ได้
C.COLUMN_DEFAULT,
dbo.fnIsColumnPrimaryKey(B. [ID], B. [ชื่อ]) เป็น PKey
จาก sysobjects A, syscolumns B, INFORMATION_SCHEMA .COLUMNS C
โดยที่ a.id = B.id
และ A.xtype ใน ('u', 'v')
และ A. ชื่อ = C.TABLE_NAME
และ B. ชื่อ = C.COLUMN_NAME
สั่งซื้อโดย A. [ID], B. [ชื่อ]
////////
ความหมายของแต่ละคอลัมน์มีดังนี้
ชื่อ sysname ชื่อคอลัมน์หรือชื่อของพารามิเตอร์ขั้นตอน
id int ID อ็อบเจ็กต์ตารางที่มีคอลัมน์นี้อยู่ หรือ ID ขั้นตอนการจัดเก็บที่เกี่ยวข้องกับพารามิเตอร์นี้
xtype Tinyint ประเภทการจัดเก็บข้อมูลทางกายภาพในรูปแบบระบบ
typestat Tinyint ใช้ภายในเท่านั้น
xusertype smallint ขยาย ID ประเภทข้อมูลที่ผู้ใช้กำหนด
length smallint ความยาวการจัดเก็บข้อมูลทางกายภาพสูงสุดใน systypes
xprec Tinyint ใช้ภายในเท่านั้น
xscale Tinyint ใช้ภายในเท่านั้น
คอลัมน์ colid Smallint หรือ ID พารามิเตอร์
xoffset smallint ใช้ภายในเท่านั้น
bitpos Tinyint ใช้ภายในเท่านั้น
Tinyint ที่สงวนไว้ใช้ภายในเท่านั้น
Colstat Smallint ใช้ภายในเท่านั้น
cdefault int รหัสค่าเริ่มต้นของคอลัมน์นี้
domain int กฎหรือ ID ข้อ จำกัด ตรวจสอบของคอลัมน์นี้
number smallint หมายเลขกระบวนการย่อยเมื่อกระบวนการถูกจัดกลุ่ม (0 หมายถึงรายการที่ไม่ใช่กระบวนการ)
เครื่องเปลี่ยนสีขนาดเล็กint ใช้ภายในเท่านั้น
autoval varbinary(255) ใช้ภายในเท่านั้น
offset smallint ออฟเซ็ตของแถวที่มีคอลัมน์นี้อยู่ ถ้าเป็นลบ ระบุแถวที่มีความยาวผันแปรได้
สถานะ Tinyint บิตแมปที่อธิบายคุณลักษณะของคอลัมน์หรือพารามิเตอร์:
0x08 = คอลัมน์อนุญาตให้มีค่าว่าง
0x10 = การเสริม ANSI มีผลเมื่อเพิ่มคอลัมน์ varchar หรือ varbinary รักษาช่องว่างต่อท้ายสำหรับคอลัมน์ varchar และศูนย์ต่อท้ายสำหรับคอลัมน์ varbinary
0x40 = พารามิเตอร์เป็นพารามิเตอร์เอาต์พุต
0x80 = คอลัมน์เป็นคอลัมน์ข้อมูลประจำตัว
type Tinyint ประเภทหน่วยเก็บข้อมูลฟิสิคัลใน systypes
usertype smallint ID ประเภทข้อมูลที่ผู้ใช้กำหนดใน systypes
printfmt varchar(255) ใช้ภายในเท่านั้น
prec smallint ระดับความแม่นยำของคอลัมน์นี้
scale int จำนวนตำแหน่งทศนิยมสำหรับคอลัมน์นี้
iscomputed int Flag ระบุว่าคอลัมน์ได้รับการคำนวณแล้วหรือไม่:
0 = ไม่ได้คำนวณ
1 = คำนวณแล้ว
isoutparam int ระบุว่าพารามิเตอร์ของโพรซีเดอร์เป็นพารามิเตอร์เอาต์พุตหรือไม่:
1 = จริง
0 = เท็จ
isnullable int บ่งชี้ว่าคอลัมน์อนุญาตให้มีค่าว่างหรือไม่:
1 = จริง
0 = เท็จ
ค่าเริ่มต้น COLUMN_DEFAULT
PKey คีย์หลัก
-
มีการใช้ฟังก์ชันต่อไปนี้:
-
สร้างฟังก์ชัน dbo.fnIsColumnPrimaryKey(@sTableID int, @nColumnName varchar(128))
--แก้ไขฟังก์ชัน dbo.fnIsColumnPrimaryKey(@sTableName varchar(128), @nColumnName varchar(128))
ส่งคืนบิต
เช่น
เริ่ม
ประกาศ @nTableID int
@nIndexID อินท์
@iint
SET @nTableID = @sTableID--OBJECT_ID(@sTableName)
เลือก @nIndexID = indid
จาก sysindexes
โดยที่ id = @nTableID
และอยู่ระหว่าง 1 ถึง 254
และ (สถานะ & 2048) = 2048
ถ้า @nIndexID เป็นโมฆะ
กลับ 0
ถ้า @nColumnName ใน
(เลือก sc.[ชื่อ]
จาก sysindexkeys ซิก
เข้าร่วมภายใน syscolumns sc บน sik.id = sc.id และ sik.colid = sc.colid
โดยที่ sik.id = @nTableID
และ sik.indid = @nIndexID)
เริ่ม
กลับ 1
สิ้นสุด
การส่งคืน 0
จบ
-
ด้วยคำสั่ง SQL นี้ คุณสามารถค้นหาแอตทริบิวต์ของคอลัมน์ของตารางทั้งหมดในฐานข้อมูลได้
ด้วยการรันคำสั่ง SQL นี้สองครั้งตามลำดับ จึงสามารถดึงข้อมูลและเปรียบเทียบแอ็ตทริบิวต์ของคอลัมน์ในไลบรารีทั้งสองได้
-------------------------------------------------- -------------------------------------------------- ---------------
สำหรับขั้นตอนและฟังก์ชันที่เก็บไว้ ให้ใช้คำสั่ง SQL ต่อไปนี้:
เลือก * จาก sysobjects โดยที่ xtype ใน ('P', 'TF', 'IF', 'FN') เรียงลำดับตาม [ชื่อ]
สามารถสอบถามชื่อขั้นตอนและฟังก์ชันที่เก็บไว้ทั้งหมดได้ ผลลัพธ์ของการสืบค้นแบบวนซ้ำ
ในแต่ละลูป ชื่อฟังก์ชันหรือกระบวนงานที่เก็บไว้จะถูกเก็บไว้ในสตริง SpobjectName จากนั้นกระบวนงานที่เก็บไว้จะถูกเรียกว่า: sp_helptext เป็นดังนี้:
exec sp_helptext '" + SpobjectName + "'
ส่งกลับตารางที่ประกอบด้วยเนื้อหาข้อความในกระบวนงานที่เก็บไว้ SpobjectName ข้อความหนึ่งแถวในกระบวนงานที่เก็บไว้สอดคล้องกับหนึ่งแถวในตาราง
ดำเนินการ SP และฟังก์ชันทั้งหมดด้วย exec sp_helptext เพื่อรับรหัสของขั้นตอนและฟังก์ชันที่เก็บไว้ทั้งหมด
เพียงใส่ผลลัพธ์ลงในตารางแล้วเปรียบเทียบความเหมือนและความแตกต่าง
อ้างอิง: หนังสือเซิร์ฟเวอร์ SQL ออนไลน์
<การสร้างขั้นตอนการจัดเก็บอัตโนมัติในฐานข้อมูล>( http://www.vckbase.com/document/viewdoc/?id=1111 )
ตอนนี้เราเปรียบเทียบเฉพาะแอตทริบิวต์คอลัมน์ของตารางและมุมมอง ตลอดจนขั้นตอนและฟังก์ชันที่จัดเก็บไว้
ไม่มีการใช้ความสัมพันธ์ข้อจำกัดระหว่างตารางเปรียบเทียบ
จะถูกเพิ่มในภายหลัง