ขั้นตอนการจัดเก็บ MS sql ขั้นตอนการจัดเก็บใน T-SQL - การสร้าง การแก้ไข การลบ ตัวอย่างการสร้างขั้นตอนด้วยพารามิเตอร์อินพุต

เมื่อทำงานกับ SQL ผู้ใช้เซิร์ฟเวอร์สามารถสร้างขั้นตอนของตนเองเพื่อดำเนินการบางอย่างได้ ขั้นตอนที่เก็บไว้เป็นออบเจ็กต์ฐานข้อมูลเต็มรูปแบบ ดังนั้นแต่ละขั้นตอนจึงถูกจัดเก็บไว้ในฐานข้อมูลเฉพาะ การเรียกโดยตรงไปยังกระบวนงานที่เก็บไว้จะทำได้ก็ต่อเมื่อดำเนินการในบริบทของฐานข้อมูลที่กระบวนงานนั้นตั้งอยู่

ประเภทของขั้นตอนการจัดเก็บ

ใน เซิร์ฟเวอร์ SQLกระบวนการจัดเก็บมีหลายประเภท

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

    ขั้นตอนการจัดเก็บแบบกำหนดเองจะใช้การดำเนินการบางอย่าง กระบวนงานที่เก็บไว้เป็นวัตถุฐานข้อมูลเต็มรูปแบบ

    เป็นผลให้แต่ละขั้นตอนการจัดเก็บอยู่ในฐานข้อมูลเฉพาะที่ซึ่งจะดำเนินการ

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

ทริกเกอร์เป็นประเภทของขั้นตอนการจัดเก็บ พวกมันจะถูกดำเนินการเมื่อมีการดำเนินการตัวดำเนินการภาษาการจัดการข้อมูล (DML) บนตาราง ทริกเกอร์ใช้เพื่อตรวจสอบความสมบูรณ์ของข้อมูลและย้อนกลับธุรกรรม

สิ่งกระตุ้นเป็นโพรซีเดอร์ SQL ที่คอมไพล์แล้ว ซึ่งการดำเนินการจะถูกกำหนดเงื่อนไขโดยการเกิดเหตุการณ์บางอย่างภายใน ฐานสัมพันธ์ข้อมูล. การใช้ทริกเกอร์นั้นสะดวกสำหรับผู้ใช้ฐานข้อมูลเป็นส่วนใหญ่ แต่การใช้งานมักเกี่ยวข้องกับต้นทุนทรัพยากรเพิ่มเติมสำหรับการดำเนินการ I/O เมื่อสามารถบรรลุผลลัพธ์เดียวกัน (โดยมีค่าใช้จ่ายน้อยกว่ามาก) โดยใช้ขั้นตอนการจัดเก็บหรือโปรแกรมแอปพลิเคชัน การใช้ทริกเกอร์จะไม่สามารถใช้งานได้จริง

ทริกเกอร์เป็นเครื่องมือเซิร์ฟเวอร์ SQL พิเศษที่ใช้เพื่อรักษาความสมบูรณ์ของข้อมูลในฐานข้อมูล ข้อจำกัดด้านความสมบูรณ์ กฎ และค่าเริ่มต้นอาจไม่บรรลุระดับการทำงานที่ต้องการเสมอไป บ่อยครั้งจำเป็นต้องใช้อัลกอริธึมการยืนยันข้อมูลที่ซับซ้อนเพื่อให้มั่นใจในความน่าเชื่อถือและความเป็นจริง นอกจากนี้ บางครั้งคุณจำเป็นต้องตรวจสอบการเปลี่ยนแปลงในค่าตารางเพื่อให้สามารถแก้ไขข้อมูลที่เกี่ยวข้องได้ตามต้องการ ทริกเกอร์ถือได้ว่าเป็นตัวกรองประเภทหนึ่งที่มีผลบังคับใช้หลังจากการดำเนินการทั้งหมดเสร็จสิ้นตามกฎเกณฑ์ ค่ามาตรฐาน ฯลฯ

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

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

สิ่งกระตุ้นเป็นวิธีการรักษาที่มีประโยชน์มากและในขณะเดียวกันก็เป็นอันตราย ดังนั้น หากตรรกะของการดำเนินการไม่ถูกต้อง คุณสามารถทำลายฐานข้อมูลทั้งหมดได้อย่างง่ายดาย ดังนั้นทริกเกอร์จึงต้องได้รับการดีบั๊กอย่างระมัดระวัง

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

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

    การออกคำเตือนเตือนให้คุณดำเนินการบางอย่างเมื่ออัปเดตตารางที่นำไปใช้ในลักษณะใดลักษณะหนึ่ง

    การรวบรวมข้อมูลการตรวจสอบโดยการบันทึกข้อมูลเกี่ยวกับ มีการเปลี่ยนแปลงและผู้ที่กระทำการนั้น

    การสนับสนุนการจำลองแบบ

รูปแบบพื้นฐานของคำสั่ง CREATE TRIGGER แสดงอยู่ด้านล่าง:

<Определение_триггера>::=

สร้างทริกเกอร์ trigger_name

ก่อน | หลังจาก<триггерное_событие>

บน<имя_таблицы>

<список_старых_или_новых_псевдонимов>]

<тело_триггера>

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

การดำเนินการที่ทำโดยทริกเกอร์จะถูกระบุสำหรับแต่ละแถว (สำหรับแต่ละแถว) ที่ครอบคลุมโดยเหตุการณ์ หรือเพียงครั้งเดียวสำหรับแต่ละเหตุการณ์ (สำหรับแต่ละคำสั่ง)

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

สิ่งกระตุ้นสามารถสร้างได้เฉพาะในฐานข้อมูลปัจจุบัน แต่สามารถเข้าถึงฐานข้อมูลอื่นภายในทริกเกอร์ได้ รวมถึงฐานข้อมูลที่อยู่บนเซิร์ฟเวอร์ระยะไกล

ขั้นตอนการจัดเก็บเป็นไปได้เฉพาะในกรณีที่ดำเนินการในบริบทของฐานข้อมูลที่มีขั้นตอนอยู่

ประเภทของขั้นตอนการจัดเก็บ

SQL Server มีหลายประเภท ขั้นตอนการจัดเก็บ.

  • ระบบ ขั้นตอนการจัดเก็บออกแบบมาเพื่อดำเนินการด้านการบริหารต่างๆ กิจกรรมการดูแลเซิร์ฟเวอร์เกือบทั้งหมดดำเนินการได้ด้วยความช่วยเหลือ เราสามารถพูดได้ว่าเป็นระบบ ขั้นตอนการจัดเก็บเป็นอินเทอร์เฟซที่ให้การทำงานร่วมกับตารางระบบ ซึ่งท้ายที่สุดแล้วอยู่ที่การเปลี่ยนแปลง เพิ่ม ลบ และดึงข้อมูลจากตารางระบบของทั้งฐานข้อมูลผู้ใช้และฐานข้อมูลระบบ ระบบ ขั้นตอนการจัดเก็บมีคำนำหน้า sp_ เก็บไว้ในฐานข้อมูลระบบและสามารถเรียกได้ในบริบทของฐานข้อมูลอื่น
  • กำหนดเอง ขั้นตอนการจัดเก็บดำเนินการบางอย่าง ขั้นตอนการจัดเก็บ– วัตถุฐานข้อมูลเต็มรูปแบบ ส่งผลให้แต่ละคน ขั้นตอนการจัดเก็บตั้งอยู่ในฐานข้อมูลเฉพาะที่ดำเนินการ
  • ชั่วคราว ขั้นตอนการจัดเก็บมีอยู่เพียงชั่วระยะเวลาหนึ่งเท่านั้น หลังจากนั้นเซิร์ฟเวอร์จะถูกทำลายโดยอัตโนมัติ แบ่งออกเป็นระดับท้องถิ่นและระดับโลก ท้องถิ่นชั่วคราว ขั้นตอนการจัดเก็บสามารถเรียกได้จากการเชื่อมต่อที่สร้างขึ้นเท่านั้น เมื่อสร้างขั้นตอนดังกล่าว คุณต้องตั้งชื่อให้ขึ้นต้นด้วยอักขระ # ตัวเดียว เช่นเดียวกับวัตถุชั่วคราวทั้งหมด ขั้นตอนการจัดเก็บประเภทนี้จะถูกลบโดยอัตโนมัติเมื่อผู้ใช้ยกเลิกการเชื่อมต่อหรือเซิร์ฟเวอร์รีสตาร์ทหรือหยุดทำงาน ทั่วโลกชั่วคราว ขั้นตอนการจัดเก็บพร้อมใช้งานสำหรับการเชื่อมต่อใด ๆ จากเซิร์ฟเวอร์ที่มีขั้นตอนเดียวกัน หากต้องการกำหนด เพียงตั้งชื่อโดยขึ้นต้นด้วยอักขระ ## ขั้นตอนเหล่านี้จะถูกลบออกเมื่อเซิร์ฟเวอร์รีสตาร์ทหรือหยุดทำงาน หรือเมื่อปิดการเชื่อมต่อในบริบทที่สร้างขึ้น

สร้าง แก้ไข และลบขั้นตอนการจัดเก็บ

การสร้าง ขั้นตอนการจัดเก็บเกี่ยวข้องกับการแก้ปัญหาต่อไปนี้:

  • กำหนดประเภทของการสร้าง ขั้นตอนการจัดเก็บ: ชั่วคราวหรือกำหนดเอง นอกจากนี้คุณสามารถสร้างระบบของคุณเองได้ ขั้นตอนการจัดเก็บโดยตั้งชื่อนำหน้าด้วย sp_ แล้ววางไว้ ฐานระบบข้อมูล. ขั้นตอนนี้จะพร้อมใช้งานในบริบทของฐานข้อมูลเซิร์ฟเวอร์ท้องถิ่น
  • การวางแผนสิทธิ์การเข้าถึง เมื่อสร้าง ขั้นตอนการจัดเก็บควรคำนึงว่าจะมีสิทธิ์การเข้าถึงวัตถุฐานข้อมูลเช่นเดียวกับผู้ใช้ที่สร้างขึ้น
  • คำนิยาม พารามิเตอร์ขั้นตอนการจัดเก็บ- คล้ายกับขั้นตอนที่รวมอยู่ในภาษาการเขียนโปรแกรมส่วนใหญ่ ขั้นตอนการจัดเก็บอาจมีพารามิเตอร์อินพุตและเอาต์พุต
  • การพัฒนาโค้ด ขั้นตอนการจัดเก็บ- รหัสขั้นตอนสามารถมีลำดับของคำสั่ง SQL ใดๆ รวมถึงการเรียกคำสั่งอื่นๆ ขั้นตอนการจัดเก็บ.

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

<определение_процедуры>::= (สร้าง | แก้ไข ) Procedure_name [;number] [(@parameter_name data_type ) [=default] ][,...n] AS sql_operator [...n]

ลองดูที่พารามิเตอร์ของคำสั่งนี้

การใช้คำนำหน้า sp_ ​​, # , ## ขั้นตอนที่สร้างขึ้นสามารถกำหนดเป็นระบบหรือชั่วคราวได้ ดังที่คุณเห็นจากไวยากรณ์คำสั่ง ไม่อนุญาตให้ระบุชื่อของเจ้าของที่จะเป็นเจ้าของขั้นตอนที่สร้างขึ้น รวมถึงชื่อของฐานข้อมูลที่ควรตั้งอยู่ ดังนั้นเพื่อที่จะวางสิ่งที่สร้างขึ้น ขั้นตอนการจัดเก็บในฐานข้อมูลเฉพาะ คุณต้องออกคำสั่ง CREATE PROCEDURE ในบริบทของฐานข้อมูลนั้น เมื่อหันออกจากร่างกาย ขั้นตอนการจัดเก็บชื่อที่สั้นลงสามารถใช้กับออบเจ็กต์ของฐานข้อมูลเดียวกันได้ กล่าวคือ โดยไม่ต้องระบุชื่อฐานข้อมูล เมื่อคุณต้องการเข้าถึงออบเจ็กต์ที่อยู่ในฐานข้อมูลอื่น จำเป็นต้องระบุชื่อฐานข้อมูล

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

เพื่อถ่ายโอนข้อมูลอินพุตและเอาต์พุตในการสร้าง ขั้นตอนการจัดเก็บสามารถใช้พารามิเตอร์ได้ ชื่อที่ต้องขึ้นต้นด้วยสัญลักษณ์ @ เช่นเดียวกับชื่อของตัวแปรท้องถิ่น ในหนึ่งเดียว ขั้นตอนการจัดเก็บคุณสามารถระบุหลายพารามิเตอร์โดยคั่นด้วยเครื่องหมายจุลภาค เนื้อความของขั้นตอนไม่ควรใช้ตัวแปรท้องถิ่นที่มีชื่อตรงกับชื่อของพารามิเตอร์ของขั้นตอนนี้

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

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

คำหลัก VARYING ใช้ร่วมกับ

รวมบรรทัดในขั้นตอนของคุณ - SET NOCOUNT ON:

ด้วยนิพจน์ DML แต่ละรายการ เซิร์ฟเวอร์ SQL จะส่งข้อความกลับถึงเราอย่างระมัดระวังซึ่งมีจำนวนบันทึกที่ประมวลผล ข้อมูลนี้มันอาจจะมีประโยชน์สำหรับเราในขณะที่ทำการดีบั๊กโค้ด แต่หลังจากนั้น มันก็จะไร้ประโยชน์โดยสิ้นเชิง โดยการเขียน SET NOCOUNT ON เราจะปิดการใช้งานฟังก์ชันนี้ สำหรับขั้นตอนการจัดเก็บที่มีหลายนิพจน์หรือ\หรือลูป การกระทำนี้สามารถเพิ่มประสิทธิภาพได้อย่างมากเนื่องจากปริมาณการรับส่งข้อมูลจะลดลงอย่างมาก

ธุรกรรม-SQL

ใช้ชื่อสคีมากับชื่อวัตถุ:

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

ธุรกรรม-SQL

SELECT * FROM dbo.MyTable -- การทำเช่นนี้เป็นสิ่งที่ดี -- แทนที่จะเป็น SELECT * FROM MyTable -- และการทำเช่นนี้ไม่ดี -- การเรียกขั้นตอน EXEC dbo.MyProc -- ดีอีกครั้ง -- แทนที่จะเป็น EXEC MyProc --แย่!

อย่าใช้คำนำหน้า "sp_" ในชื่อของขั้นตอนการจัดเก็บของคุณ:

หากชื่อขั้นตอนของเราขึ้นต้นด้วย "sp_" SQL Server จะค้นหาในฐานข้อมูลหลักก่อน ความจริงก็คือคำนำหน้านี้ใช้สำหรับขั้นตอนการจัดเก็บภายในส่วนบุคคลของเซิร์ฟเวอร์ ดังนั้นการใช้งานอาจนำไปสู่ค่าใช้จ่ายเพิ่มเติมและแม้กระทั่งผลลัพธ์ที่ไม่ถูกต้องหากพบขั้นตอนที่มีชื่อเดียวกันกับของคุณในฐานข้อมูล

ใช้ IF EXISTS (SELECT 1) แทน IF EXISTS (SELECT *):

ในการตรวจสอบการมีอยู่ของบันทึกในตารางอื่น เราใช้คำสั่ง IF EXISTS สำนวนนี้คืนค่าเป็นจริงหากส่งคืนค่าอย่างน้อยหนึ่งค่าจากนิพจน์ภายใน ซึ่งไม่สำคัญว่า "1" จะเป็นคอลัมน์ทั้งหมดหรือตาราง โดยพื้นฐานแล้วข้อมูลที่ส่งคืนจะไม่ถูกใช้ในทางใดทางหนึ่ง ดังนั้น ในการบีบอัดการรับส่งข้อมูลระหว่างการส่งข้อมูล จึงควรใช้ "1" ดังที่แสดงด้านล่าง

เราพิจารณาสถานการณ์ที่กระบวนงานที่เก็บไว้สามารถลดประสิทธิภาพการทำงานของแบบสอบถามได้


เมื่อรวบรวมกระบวนงานที่เก็บไว้ใน MS SQL Server 2000 กระบวนงานที่เก็บไว้จะถูกวางไว้ในแคชของกระบวนงาน ซึ่งสามารถปรับปรุงประสิทธิภาพเมื่อดำเนินการเหล่านั้นโดยขจัดความจำเป็นในการ การแยกวิเคราะห์การเพิ่มประสิทธิภาพและการรวบรวมรหัสขั้นตอนการจัดเก็บ
ในทางกลับกัน มีข้อผิดพลาดในการจัดเก็บโค้ดที่คอมไพล์แล้วของกระบวนงานที่เก็บไว้ซึ่งอาจมีผลตรงกันข้าม
ความจริงก็คือเมื่อรวบรวมขั้นตอนการจัดเก็บ แผนการดำเนินการของผู้ปฏิบัติงานเหล่านั้นที่ประกอบเป็นรหัสขั้นตอนจะถูกรวบรวม ดังนั้นหากขั้นตอนการจัดเก็บที่คอมไพล์ถูกแคช แผนการดำเนินการจะถูกแคชด้วย ดังนั้นขั้นตอนการจัดเก็บจะไม่ ได้รับการปรับให้เหมาะสมสำหรับ สถานการณ์เฉพาะและพารามิเตอร์การสืบค้น
เรามาทำการทดลองเล็กๆ น้อยๆ เพื่อสาธิตสิ่งนี้กัน

ขั้นตอนที่ 1- การสร้างฐานข้อมูล
สำหรับการทดลองเราจะสร้างฐานข้อมูลแยกต่างหาก

สร้างฐานข้อมูล test_sp_perf
เปิด (NAME="test_data", FILENAME="c:\temp\test_data", SIZE=1, MAXSIZE=10,FILEGROWTH=1Mb)
เข้าสู่ระบบ (NAME="test_log", FILENAME="c:\temp\test_log", SIZE=1, MAXSIZE=10,FILEGROWTH=1Mb)

ขั้นตอนที่ 2การสร้างตาราง
สร้างตาราง sp_perf_test (column1 int, column2 char (5000))

ขั้นตอนที่ 3เติมตารางด้วยแถวทดสอบ แถวที่ซ้ำกันจะถูกเพิ่มลงในตารางโดยเจตนา 10,000 บรรทัดที่มีตัวเลขตั้งแต่ 1 ถึง 10,000 และ 10,000 บรรทัดที่มีตัวเลข 50,000

ประกาศ @i int
SET @i=1
ในขณะที่(@i<10000)
เริ่ม
INSERT INTO sp_perf_test(column1, column2) VALUES(@i,"Test string #"+CAST(@i as char(8)))
INSERT INTO sp_perf_test(column1, column2) ค่า(50000,"Test string #"+CAST(@i as char(8)))
SET @i= @i+1
จบ

เลือก COUNT(*) จาก sp_perf_test
ไป

ขั้นตอนที่ 4การสร้างดัชนีที่ไม่ใช่คลัสเตอร์ เนื่องจากแผนการดำเนินการถูกแคชไว้กับขั้นตอน ดัชนีจะถูกใช้ในลักษณะเดียวกันกับการโทรทั้งหมด

สร้าง CL_perf_test ดัชนีที่ไม่เป็นกลุ่มบน sp_perf_test (คอลัมน์ 1)
ไป

ขั้นตอนที่ 5การสร้างขั้นตอนการจัดเก็บ ขั้นตอนเพียงดำเนินการคำสั่ง SELECT โดยมีเงื่อนไข

สร้าง PROC proc1 (@param int)
เช่น
เลือก column1, column2 จาก sp_perf_test โดยที่ column1=@param
ไป

ขั้นตอนที่ 6เรียกใช้ขั้นตอนการจัดเก็บ เมื่อรันขั้นตอนที่มีช่องโหว่ พารามิเตอร์ที่เลือกจะถูกใช้โดยเฉพาะ จากขั้นตอนนี้เราได้รับ 1 บรรทัด แผนการดำเนินการบ่งชี้ถึงการใช้ดัชนีที่ไม่ใช่คลัสเตอร์เนื่องจาก แบบสอบถามเป็นแบบเลือกสรรและนี่เป็นวิธีที่ดีที่สุดในการดึงข้อมูลแถว ขั้นตอนที่ปรับให้เหมาะสมเพื่อดึงข้อมูลแถวเดียวจะถูกจัดเก็บไว้ในแคชขั้นตอน

EXEC proc1 1234
ไป

ขั้นตอนที่ 7เรียกใช้กระบวนงานที่เก็บไว้ด้วยพารามิเตอร์ที่ไม่เลือก ค่าที่ใช้เป็นพารามิเตอร์คือ 50,000 มีแถวประมาณ 10,000 แถวที่มีค่านี้ในคอลัมน์แรก ดังนั้น การใช้ดัชนีที่ไม่ใช่คลัสเตอร์และการดำเนินการค้นหาบุ๊กมาร์กจึงไม่ได้ผล แต่เนื่องจากโค้ดที่คอมไพล์แล้วพร้อมแผนการดำเนินการถูกจัดเก็บไว้ใน แคชขั้นตอน นี่คือสิ่งที่จะใช้ แผนการดำเนินการจะแสดงสิ่งนี้ เช่นเดียวกับข้อเท็จจริงที่มีการดำเนินการค้นหาบุ๊กมาร์กสำหรับ 9999 แถว

EXEC proc1 50000
ไป

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

เลือก column1, column2 จาก sp_perf_test โดยที่ column1=50000
ไป

ดังนั้น เราสามารถสรุปได้ว่าการใช้ Stored Procedure อาจไม่ได้ปรับปรุงประสิทธิภาพการสืบค้นเสมอไป คุณควรระมัดระวังอย่างมากเกี่ยวกับขั้นตอนการจัดเก็บที่ดำเนินการกับผลลัพธ์ที่มีจำนวนแถวผันแปร และใช้แผนการดำเนินการที่แตกต่างกัน
คุณสามารถใช้สคริปต์เพื่อทำการทดลองซ้ำบนเซิร์ฟเวอร์ MS SQL ของคุณได้

วัตถุประสงค์ของการทำงาน– เรียนรู้การสร้างและใช้ขั้นตอนการจัดเก็บบนเซิร์ฟเวอร์ฐานข้อมูล

1. ศึกษาตัวอย่างทั้งหมด วิเคราะห์ผลลัพธ์ของการดำเนินการในยูทิลิตี้ SQL Server สตูดิโอการจัดการ- ตรวจสอบการมีอยู่ของขั้นตอนที่สร้างขึ้นในฐานข้อมูลปัจจุบัน

2. ทำตัวอย่างและงานทั้งหมดให้เสร็จสิ้นระหว่างการทำงานในห้องปฏิบัติการ

3. ทำงานแต่ละอย่างให้เสร็จสิ้นตามตัวเลือก

คำชี้แจงในการปฏิบัติงาน

เพื่อเชี่ยวชาญการเขียนโปรแกรมขั้นตอนการจัดเก็บ เราใช้ฐานข้อมูลตัวอย่างที่เรียกว่า DB_Booksซึ่งถูกสร้างขึ้นในงานห้องปฏิบัติการครั้งที่ 1 เมื่อเสร็จสิ้นตัวอย่างและงานต่างๆ ให้ใส่ใจกับความสอดคล้องของชื่อฐานข้อมูล ตาราง และวัตถุโครงการอื่น ๆ

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

ประเภทของขั้นตอนการจัดเก็บ

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

ขั้นตอนการจัดเก็บแบบกำหนดเองจะใช้การดำเนินการบางอย่าง กระบวนงานที่เก็บไว้เป็นวัตถุฐานข้อมูลเต็มรูปแบบ เป็นผลให้แต่ละขั้นตอนการจัดเก็บอยู่ในฐานข้อมูลเฉพาะที่ซึ่งจะดำเนินการ

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

การสร้าง การแก้ไขขั้นตอนการจัดเก็บ

การสร้างขั้นตอนการจัดเก็บเกี่ยวข้องกับการแก้ปัญหาต่อไปนี้: การวางแผนสิทธิ์การเข้าถึง เมื่อคุณสร้างกระบวนงานที่เก็บไว้ โปรดทราบว่าขั้นตอนนั้นจะมีสิทธิ์การเข้าถึงวัตถุฐานข้อมูลเหมือนกับผู้ใช้ที่สร้างขึ้น การกำหนดพารามิเตอร์ของกระบวนงานที่เก็บไว้สามารถมีพารามิเตอร์อินพุตและเอาต์พุต การพัฒนาโค้ดขั้นตอนการจัดเก็บ รหัสขั้นตอนสามารถมีลำดับของคำสั่ง SQL ใดๆ รวมถึงการเรียกไปยังขั้นตอนที่เก็บไว้อื่นๆ

ไวยากรณ์ของตัวดำเนินการสำหรับการสร้างใหม่หรือการเปลี่ยนแปลงขั้นตอนการจัดเก็บที่มีอยู่ในรูปแบบ MS SQL Server:

( สร้าง | แก้ไข ) PROC[ EDURE] Procedure_name [ ;number] [ ( @parameter_name data_type ) [ VARYING ] [ = DEFAULT ] [ OUTPUT ] ] [ ,... n] [ WITH ( RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION ) ] [ สำหรับการจำลอง] AS sql_statement [ ... n]

ลองดูที่พารามิเตอร์ของคำสั่งนี้

การใช้คำนำหน้า sp_, #, ## สามารถกำหนดขั้นตอนที่สร้างขึ้นเป็นระบบหรือชั่วคราวได้ ดังที่คุณเห็นจากไวยากรณ์คำสั่ง ไม่อนุญาตให้ระบุชื่อของเจ้าของที่จะเป็นเจ้าของขั้นตอนที่สร้างขึ้น รวมถึงชื่อของฐานข้อมูลที่ควรตั้งอยู่ ดังนั้น เมื่อต้องการวางกระบวนงานที่เก็บไว้ที่คุณกำลังสร้างในฐานข้อมูลเฉพาะ คุณต้องออกคำสั่ง CREATE PROCEDURE ในบริบทของฐานข้อมูลนั้น เมื่อเข้าถึงออบเจ็กต์ของฐานข้อมูลเดียวกันจากเนื้อความของกระบวนงานที่เก็บไว้ คุณสามารถใช้ชื่อที่สั้นลงได้ กล่าวคือ โดยไม่ต้องระบุชื่อฐานข้อมูล เมื่อคุณต้องการเข้าถึงออบเจ็กต์ที่อยู่ในฐานข้อมูลอื่น จำเป็นต้องระบุชื่อฐานข้อมูล

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

การมีอยู่ของคีย์เวิร์ด OUTPUT หมายความว่าพารามิเตอร์ที่เกี่ยวข้องมีวัตถุประสงค์เพื่อส่งคืนข้อมูลจากขั้นตอนที่เก็บไว้ อย่างไรก็ตามนี่ไม่ได้หมายความว่าพารามิเตอร์ไม่เหมาะสำหรับการส่งค่าไปยังขั้นตอนการจัดเก็บ การระบุคีย์เวิร์ด OUTPUT จะสั่งให้เซิร์ฟเวอร์กำหนดค่าพารามิเตอร์ปัจจุบันให้กับตัวแปรภายในเครื่องที่ระบุเป็นค่าพารามิเตอร์เมื่อออกจากขั้นตอนที่เก็บไว้ เมื่อออกจากขั้นตอนที่เก็บไว้ โปรดทราบว่าเมื่อระบุคีย์เวิร์ด OUTPUT ค่าของพารามิเตอร์ที่เกี่ยวข้องเมื่อเรียกใช้ขั้นตอนสามารถตั้งค่าได้โดยใช้ตัวแปรท้องถิ่นเท่านั้น ไม่อนุญาตให้ใช้นิพจน์หรือค่าคงที่ใดๆ ที่ได้รับอนุญาตสำหรับพารามิเตอร์ปกติ คีย์เวิร์ด VARYING ใช้ร่วมกับพารามิเตอร์ OUTPUT ซึ่งเป็นประเภท CURSOR โดยระบุว่าเอาต์พุตจะเป็นชุดผลลัพธ์

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

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

จำเป็นต้องใช้พารามิเตอร์ FOR REPLICATION เมื่อจำลองข้อมูลและรวมถึงขั้นตอนการจัดเก็บที่สร้างขึ้นเป็นบทความในสิ่งพิมพ์ คำสำคัญ ENCRYPTION สั่งให้เซิร์ฟเวอร์เข้ารหัสรหัสขั้นตอนที่เก็บไว้ ซึ่งสามารถป้องกันการใช้อัลกอริธึมที่เป็นกรรมสิทธิ์ซึ่งนำขั้นตอนที่เก็บไว้ไปใช้ คำสำคัญ AS ถูกวางไว้ที่จุดเริ่มต้นของเนื้อหาของกระบวนงานที่เก็บไว้เอง เนื้อความของโพรซีเดอร์สามารถใช้คำสั่ง SQL เกือบทั้งหมด ประกาศธุรกรรม ตั้งค่าล็อค และเรียกโพรซีเดอร์ที่เก็บไว้อื่นๆ คุณสามารถออกจากกระบวนงานที่เก็บไว้ได้โดยใช้คำสั่ง RETURN

การลบขั้นตอนการจัดเก็บ

วางขั้นตอน (procedure_name) [,...n]

การดำเนินการขั้นตอนการจัดเก็บ

หากต้องการดำเนินการขั้นตอนที่เก็บไว้ ให้ใช้คำสั่ง: [ [ EXEC [ UTE] Procedure_name [ ;number] [ [ @parameter_name= ] ( value | @variable_name) [ OUTPUT ] | [ ค่าเริ่มต้น ] ] [ ,... n]

ถ้าการเรียกโพรซีเจอร์ที่เก็บไว้ไม่ใช่คำสั่งเดียวในแบตช์ ก็จำเป็นต้องมีคำสั่ง EXECUTE นอกจากนี้ คำสั่งนี้จำเป็นต้องเรียกโพรซีเดอร์จากเนื้อหาของโพรซีเดอร์หรือทริกเกอร์อื่น

อนุญาตให้ใช้คีย์เวิร์ด OUTPUT เมื่อเรียกใช้โพรซีเดอร์เฉพาะกับพารามิเตอร์ที่ได้รับการประกาศเมื่อสร้างโพรซีเดอร์ด้วยคีย์เวิร์ด OUTPUT

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

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

โปรดทราบว่าเมื่อเรียกโพรซีเดอร์จะระบุชื่อพารามิเตอร์ที่มีค่าหรือเฉพาะค่าที่ไม่มีชื่อพารามิเตอร์เท่านั้น ไม่อนุญาตให้รวมเข้าด้วยกัน

การใช้ RETURN ในขั้นตอนการจัดเก็บ

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

สร้างขั้นตอน Count_Books AS SELECT COUNT (Code_book) จากหนังสือ GO

ภารกิจที่ 1

EXEC Count_Books

ตรวจสอบผลลัพธ์

ตัวอย่างการสร้างขั้นตอนค พารามิเตอร์อินพุต:

สร้างขั้นตอน Count_Books_Pages @Count_pages AS INT AS SELECT COUNT (Code_book) จากหนังสือ WHERE Pages>= @Count_pages GO

ภารกิจที่ 2- สร้าง ขั้นตอนนี้ในส่วน Stored Procedures ของฐานข้อมูล DB_Books ผ่านยูทิลิตี้ SQL Server Management Studio รันโดยใช้คำสั่ง

EXEC นับ_หนังสือ_หน้า 100

ตรวจสอบผลลัพธ์

ตัวอย่างการสร้างขั้นตอนด้วยพารามิเตอร์อินพุต:

สร้างขั้นตอนการสร้าง Count_Books_Title @Count_pages AS INT , @Title AS CHAR (10 ) AS SELECT COUNT (Code_book) จากหนังสือ WHERE Pages>= @Count_pages AND Title_book LIKE @Title GO

ภารกิจที่ 3สร้างขั้นตอนนี้ในส่วน Stored Procedures ของฐานข้อมูล DB_Books โดยใช้ยูทิลิตี้ Studio จัดการเซิร์ฟเวอร์ SQL รันโดยใช้คำสั่ง

EXEC Count_Books_Title 100 , "P%"

ตรวจสอบผลลัพธ์

ตัวอย่างการสร้างขั้นตอนด้วยพารามิเตอร์อินพุตและพารามิเตอร์เอาต์พุต:

สร้างขั้นตอน Count_Books_Itogo @Count_pages INT , @Title CHAR (10 ) , @Itogo INT OUTPUT AS SELECT @Itogo = COUNT (Code_book) จากหนังสือ WHERE Pages>= @Count_pages AND Title_book LIKE @Title GO

ภารกิจที่ 4สร้างขั้นตอนนี้ในส่วน Stored Procedures ของฐานข้อมูล DB_Books โดยใช้ยูทิลิตี้ Studio จัดการเซิร์ฟเวอร์ SQL รันโดยใช้ชุดคำสั่ง:

Sql> ประกาศ @q เป็น int EXEC Count_Books_Itogo 100, "P%", @q เอาต์พุตเลือก @q

ตรวจสอบผลลัพธ์

ตัวอย่างการสร้างขั้นตอนด้วยพารามิเตอร์อินพุตและ RETURN:

สร้างขั้นตอนการตรวจสอบชื่อ @param INT AS IF (เลือก Name_author จากผู้เขียน WHERE Code_author = @param) = "Pushkin A.S."

ส่งคืน 1 มิฉะนั้นส่งคืน 2ภารกิจที่ 5

สร้างขั้นตอนนี้ในส่วน Stored Procedures ของฐานข้อมูล DB_Books โดยใช้ยูทิลิตี้ Studio จัดการเซิร์ฟเวอร์ SQL รันโดยใช้คำสั่ง:

ประกาศ @return_status INT EXEC @return_status = ชื่อตรวจสอบ 1 เลือก "สถานะการคืนสินค้า" = @return_status

ตัวอย่างการสร้างขั้นตอนโดยไม่มีพารามิเตอร์เพื่อเพิ่มค่าของฟิลด์คีย์ในตารางการซื้อ 2 เท่า:

สร้าง PROC update_proc AS UPDATE ซื้อ SET Code_purchase = Code_purchase* 2สร้างขั้นตอนนี้ในส่วน Stored Procedures ของฐานข้อมูล DB_Books โดยใช้ยูทิลิตี้ Studio จัดการเซิร์ฟเวอร์ SQL รันโดยใช้คำสั่ง

EXEC อัพเดต_proc

ตัวอย่างของขั้นตอนที่มีพารามิเตอร์อินพุตเพื่อรับข้อมูลทั้งหมดเกี่ยวกับผู้เขียนเฉพาะ:

สร้าง PROC select_author @k CHAR (30 ) AS SELECT * จากผู้เขียน WHERE name_author= @k

ภารกิจที่ 7

EXEC select_author "พุชกิน A.S."

หรือ select_author @k= "Pushkin A.S."

หรือ EXEC select_author @k= "Pushkin A.S."

ตัวอย่างการสร้างขั้นตอนด้วยพารามิเตอร์อินพุตและค่าเริ่มต้นเพื่อเพิ่มค่าของฟิลด์คีย์ในตารางการซื้อตามจำนวนครั้งที่ระบุ (2 ครั้งโดยค่าเริ่มต้น):

สร้าง PROC update_proc @p INT = 2 AS อัปเดตการซื้อ SET Code_purchase = Code_purchase * @pขั้นตอนไม่ส่งคืนข้อมูลใดๆ

ภารกิจที่ 8 สร้างขั้นตอนนี้ในส่วน Stored Procedures ของฐานข้อมูล DB_Books โดยใช้ยูทิลิตี้ Studio จัดการเซิร์ฟเวอร์ SQL รันโดยใช้คำสั่ง:

EXEC update_proc 4 หรือ EXEC update_proc @p = 4 หรือ EXEC update_proc

--จะใช้ค่าเริ่มต้น

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

สร้าง PROC count_purchases @d1 SMALLDATETIME, @d2 SMALLDATETIME, @c INT OUTPUT AS SELECT @c= COUNT (Code_purchase) จากการซื้อ WHERE Date_order BETWEEN @d1 AND @d2 SET @c = ISNULL(@c, 0 )

ภารกิจที่ 9 ประกาศ @c2 INT EXEC count_purchases '01-มิ.ย.- 2549 ', '01- ก.ค.- 2549', @c2 OUTPUT SELECT @c2 №4

ตัวเลือกสำหรับงานงานห้องปฏิบัติการ บทบัญญัติทั่วไปในยูทิลิตี้ SQL การจัดการเซิร์ฟเวอร์สตูดิโอสร้าง หน้าใหม่สำหรับรหัส (ปุ่ม "สร้างคำขอ") ทำให้ฐานข้อมูล DB_Books ที่สร้างขึ้นโดยทางโปรแกรมใช้งานได้โดยใช้คำสั่ง Use สร้างขั้นตอนการจัดเก็บโดยใช้ตัวดำเนินการ

สร้างขั้นตอน

และกำหนดชื่อของขั้นตอนอย่างอิสระ แต่ละขั้นตอนจะดำเนินการหนึ่งแบบสอบถาม SQL ที่ถูกดำเนินการในห้องปฏิบัติการที่สอง นอกจากนี้จำเป็นต้องเปลี่ยนรหัส SQL ของแบบสอบถามเพื่อให้สามารถส่งค่าของฟิลด์ที่ใช้ในการค้นหาได้

ตัวอย่างเช่น งานเริ่มแรกและคำขอในห้องปฏิบัติการหมายเลข 2:

*/ –ในงานนี้ ขั้นตอนต่อไปนี้จะถูกสร้างขึ้น:

สร้าง PROC select_name_company @comp CHAR (30 ) AS เลือก Name_company, โทรศัพท์, INN จากการจัดส่ง โดยที่ Name_company = @comp

–หากต้องการเริ่มขั้นตอน ให้ใช้คำสั่ง:

EXEC select_name_company "JSC MIR"

รายการงาน

สร้างโปรแกรมใหม่ใน SQL Server Management Studio ทำให้ฐานข้อมูลแต่ละฐานข้อมูลที่สร้างขึ้นในงานห้องปฏิบัติการหมายเลข 1 ใช้งานโดยทางโปรแกรมโดยใช้คำสั่ง Use สร้างขั้นตอนการจัดเก็บโดยใช้คำสั่งสร้างขั้นตอน และกำหนดชื่อของขั้นตอนด้วยตนเอง แต่ละขั้นตอนจะดำเนินการอย่างใดอย่างหนึ่ง แบบสอบถาม SQLซึ่งนำเสนอในรูปแบบ งานส่วนบุคคลตามตัวเลือก

ตัวเลือกที่ 1

1. แสดงรายชื่อพนักงานที่มีบุตรอย่างน้อยหนึ่งคน

2. แสดงรายชื่อเด็กที่ได้รับของขวัญในช่วงระยะเวลาที่กำหนด

3.แสดงรายชื่อผู้ปกครองที่มีบุตรที่ยังไม่บรรลุนิติภาวะ

4. แสดงข้อมูลเกี่ยวกับของขวัญที่มีค่ามากกว่าจำนวนที่กำหนดโดยเรียงตามวันที่

ตัวเลือกที่ 2

1.แสดงรายการอุปกรณ์ตามประเภทที่ระบุ

2. แสดงจำนวนเครื่องที่ซ่อมและยอดรวมค่าซ่อมจากช่างที่ระบุ

3. แสดงรายชื่อเจ้าของอุปกรณ์และจำนวนคำขอ โดยจัดเรียงตามจำนวนคำขอจากมากไปน้อย

4. แสดงข้อมูลเกี่ยวกับช่างฝีมือที่มียศมากกว่าจำนวนที่กำหนดหรือวันที่จ้างงานน้อยกว่าวันที่กำหนด

ตัวเลือกที่ 3

2. แสดงรายการรหัสการขายที่ขายดอกไม้เกินจำนวนที่กำหนด

3. แสดงวันที่ขาย จำนวน ผู้ขาย และดอกไม้ ตามรหัสการขายที่ระบุ

4. แสดงรายการดอกไม้และพันธุ์ดอกไม้ที่มีความสูงเกินจำนวนหรือบานที่กำหนด

ตัวเลือกที่ 4

1.แสดงรายการยาพร้อมข้อบ่งชี้ในการใช้

2. แสดงรายการวันที่จัดส่งซึ่งมีการขายยาชื่อเดียวกันเกินจำนวนที่ระบุ

3. แสดงวันที่จัดส่ง จำนวน ชื่อเต็มของผู้จัดการจากผู้จำหน่าย และชื่อยาตามรหัสใบเสร็จรับเงินที่มากกว่าจำนวนที่กำหนด

ตัวเลือกที่ 5

2.แสดงรายการอุปกรณ์ที่เลิกใช้งานด้วยเหตุผลที่กำหนด

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

4. แสดงรายการอุปกรณ์ตามประเภทที่ระบุหรือวันที่รับสินค้ามากกว่าค่าที่กำหนด

ตัวเลือกที่ 6

1. แสดงรายการอาหารที่มีน้ำหนักมากกว่าจำนวนที่กำหนด

2. แสดงรายการผลิตภัณฑ์ที่มีชื่อที่มีส่วนของคำที่ระบุ

3. แสดงปริมาณของผลิตภัณฑ์ ชื่ออาหาร ชื่อผลิตภัณฑ์พร้อมรหัสจานจากค่าเริ่มต้นที่ระบุไปจนถึงค่าสุดท้ายที่กำหนด

4. แสดงลำดับการเตรียมอาหารและชื่ออาหารที่มีปริมาณคาร์โบไฮเดรตมากกว่าค่าที่กำหนดหรือปริมาณแคลอรี่มากกว่าค่าที่กำหนด

ตัวเลือก 7

1. แสดงรายชื่อพนักงานตามตำแหน่งที่ระบุ

3. แสดงวันที่จดทะเบียน ประเภทเอกสาร ชื่อเต็มของนายทะเบียน และชื่อหน่วยงานสำหรับเอกสารที่ลงทะเบียนในช่วงเวลาที่กำหนด

4. แสดงรายการเอกสารที่ลงทะเบียนพร้อมประเภทเอกสารเฉพาะหรือวันที่ลงทะเบียนมากกว่าค่าที่กำหนด

ตัวเลือกที่ 8

1.แสดงรายชื่อพนักงานด้วย เหตุผลที่ระบุไว้การเลิกจ้าง

3. แสดงวันที่ลงทะเบียน เหตุผลในการเลิกจ้าง ชื่อนามสกุล ลูกจ้าง สำหรับเอกสารที่ลงทะเบียนในช่วงเวลาที่กำหนด

ตัวเลือก 9

1. แสดงรายชื่อพนักงานที่ลาตามประเภทที่กำหนด

2.แสดงรายการเอกสารที่มีวันจดทะเบียนในช่วงเวลาที่กำหนด

3. แสดงวันที่ลงทะเบียน, ประเภทการลา, ชื่อเต็มของพนักงานสำหรับเอกสารที่ลงทะเบียนในช่วงเวลาที่กำหนด

4. แสดงรายการเอกสารที่ลงทะเบียนพร้อมรหัสเอกสารในช่วงที่กำหนด

ตัวเลือกที่ 10

1. แสดงรายชื่อพนักงานตามตำแหน่งที่ระบุ

2. แสดงรายการเอกสารที่มีเนื้อหามีส่วนของคำที่ระบุ

3. แสดงวันที่ลงทะเบียน ประเภทเอกสาร ชื่อนามสกุลของผู้ส่ง และชื่อหน่วยงานสำหรับเอกสารที่ลงทะเบียนในช่วงเวลาที่กำหนด

4. แสดงรายการเอกสารที่ลงทะเบียนตามประเภทเอกสารที่ระบุหรือรหัสเอกสารน้อยกว่าค่าที่กำหนด

ตัวเลือกที่ 11

1. แสดงรายชื่อพนักงานที่ได้รับมอบหมายให้ดำรงตำแหน่งที่กำหนด

2.แสดงรายการเอกสารที่มีวันจดทะเบียนในช่วงเวลาที่กำหนด

3. แสดงวันที่ลงทะเบียน ตำแหน่ง ชื่อเต็มของพนักงานสำหรับเอกสารที่ลงทะเบียนในช่วงเวลาที่กำหนด

4. แสดงรายการเอกสารที่ลงทะเบียนพร้อมรหัสเอกสารในช่วงที่กำหนด

ตัวเลือก 12

3. แสดงรายชื่อผู้ที่เช่าอุปกรณ์และจำนวนคำขอ โดยจัดเรียงตามจำนวนคำขอตามลำดับจากมากไปน้อย

ตัวเลือกที่ 13

1.แสดงรายการอุปกรณ์ตามประเภทที่กำหนด 2. แสดงรายการอุปกรณ์ที่พนักงานคนใดคนหนึ่งตัดออก

3. แสดงจำนวนอุปกรณ์ที่เลิกใช้งาน แบ่งกลุ่มตามประเภทอุปกรณ์

4. แสดงข้อมูลเกี่ยวกับพนักงานที่มีวันจ้างงานมากกว่าวันที่กำหนด

ตัวเลือก 14

1. พิมพ์รายการดอกไม้ตามประเภทใบที่ระบุ

2. แสดงรายการรหัสใบเสร็จซึ่งมีการขายดอกไม้ในจำนวนที่มากกว่ามูลค่าที่กำหนด

3. แสดงวันที่รับสินค้า จำนวน ชื่อผู้จำหน่าย และสีตามรหัสผู้จำหน่ายเฉพาะ

4. แสดงรายการดอกไม้และพันธุ์ดอกไม้ที่มีความสูงมากกว่า จำนวนหนึ่งหรือกำลังเบ่งบาน

ตัวเลือกที่ 15

1. แสดงรายชื่อลูกค้าที่เช็คอินห้องพักในช่วงเวลาที่กำหนด

2. แสดงยอดการชำระเงินรวมสำหรับห้องพักของลูกค้าแต่ละราย

3. แสดงวันที่เข้าพัก ประเภทห้องพัก ชื่อนามสกุลของลูกค้าที่ลงทะเบียนในช่วงเวลาที่กำหนด

4. แสดงรายชื่อลูกค้าที่ลงทะเบียนในห้องบางประเภท

ตัวเลือกที่ 16

1.แสดงรายการอุปกรณ์ตามประเภทที่กำหนด

2. แสดงรายการอุปกรณ์ที่ลูกค้าเฉพาะรายเช่า

3. แสดงรายชื่อผู้ที่เช่าอุปกรณ์และจำนวนคำขอ โดยจัดเรียงตามจำนวนคำขอตามลำดับจากมากไปน้อย

4. แสดงข้อมูลเกี่ยวกับลูกค้าเรียงตามที่อยู่

ตัวเลือกที่ 17

1. แสดงรายการของมีค่าที่มีราคาซื้อมากกว่ามูลค่าที่กำหนดหรือระยะเวลาการรับประกันมากกว่าจำนวนที่กำหนด

2. แสดงรายการที่ตั้งของสินทรัพย์วัสดุที่มีชื่อมีคำที่ระบุ

3. แสดงผลรวมของค่าด้วยรหัสในช่วงที่กำหนด

4. แสดงรายชื่อผู้รับผิดชอบทางการเงินพร้อมวันที่เข้าทำงานอยู่ในช่วงที่กำหนด

ตัวเลือกที่ 18

1. แสดงรายการการซ่อมแซมที่ดำเนินการโดยช่างเทคนิคเฉพาะ

2. แสดงรายการขั้นตอนการทำงานที่รวมอยู่ในผลงานที่มีชื่อมีคำที่ระบุ

3. แสดงผลรวมต้นทุนขั้นตอนงานซ่อมสำหรับงานโดยมีรหัสอยู่ในช่วงที่กำหนด

4. แสดงรายการหัวหน้าคนงานพร้อมวันจ้างงานในช่วงที่กำหนด

ตัวเลือกที่ 19

1.แสดงรายการยาพร้อมข้อบ่งชี้เฉพาะ

2. แสดงรายการหมายเลขใบเสร็จรับเงินที่มีการขายยาเกินจำนวนที่กำหนด

3. แสดงวันที่ขาย จำนวนเงิน ชื่อเต็มของแคชเชียร์และยาบนใบเสร็จพร้อมหมายเลขที่ระบุ

4. แสดงรายการยาและหน่วยวัดยาที่มีปริมาณในบรรจุภัณฑ์มากกว่าจำนวนที่กำหนดหรือรหัสยาน้อยกว่าค่าที่กำหนด

ตัวเลือกที่ 20

1. แสดงรายชื่อพนักงานตามตำแหน่งที่ระบุ

2. แสดงรายการเอกสารที่มีเนื้อหามีส่วนของคำที่ระบุ

3. แสดงวันที่จดทะเบียน ประเภทเอกสาร ชื่อเต็มของผู้ดำเนินการ และข้อเท็จจริงในการดำเนินการกับเอกสารที่ลงทะเบียนในช่วงเวลาที่กำหนด

4. แสดงรายการเอกสารที่ลงทะเบียนพร้อมประเภทเอกสารหรือรหัสเอกสารที่ระบุในช่วงที่กำหนด