แบบสอบถามแบบไดนามิกหรือ "@ตัวแปรชื่อตาราง" ตัวแปร ตัวแปรใน sql

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

การประกาศตัวแปร PL/SQL

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

ชื่อประเภทข้อมูล [ := | ค่าเริ่มต้น default_value];

เริ่มต้นสำหรับ book_rec IN (เลือก * จากหนังสือ) LOOP process_book (book_rec);

สิ้นสุดลูป; จบ;

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

การซิงโครไนซ์กับคอลัมน์ฐานข้อมูล ตัวแปร PL/SQL มักจะ "นำเสนอ" ข้อมูลจากตารางฐานข้อมูล หากคุณประกาศตัวแปรอย่างชัดเจนแล้วเปลี่ยนโครงสร้างตาราง อาจทำให้โปรแกรมเสียหายได้

การทำให้เป็นมาตรฐานของตัวแปรท้องถิ่น สมมติว่าตัวแปร PL/SQL เก็บค่าจากการคำนวณที่ใช้ในตำแหน่งต่างๆ ในแอปพลิเคชัน อะไรคือผลที่ตามมาของการทำซ้ำ (ฮาร์ดโค้ด) ชนิดข้อมูลและข้อจำกัดเดียวกันในการประกาศทั้งหมด

การตั้งค่าตัวแปร

SET @b = @a * 1.5

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

SET @c = COUNT(*) จากเมือง

และคำสั่งต่อไปนี้ดำเนินการได้สำเร็จ:

SET @c = (เลือก COUNT(*) จากเมือง)

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

SELECT @c = COUNT(*) จากเมือง

โปรดทราบว่าโค้ดนี้ชัดเจนกว่าเล็กน้อย (โดยเฉพาะอย่างยิ่งจะกระชับมากกว่า แม้ว่าจะทำสิ่งเดียวกันก็ตาม)

ดังนั้นจึงเป็นไปได้ที่จะกำหนดแบบแผนที่ยอมรับโดยทั่วไปต่อไปนี้สำหรับการใช้ตัวดำเนินการทั้งสอง

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

คำสั่ง SELECT ถูกใช้เมื่อการกำหนดค่าให้กับตัวแปรต้องเป็นไปตามแบบสอบถาม

การใช้ตัวแปรในการสืบค้น SQL

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

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

ประกาศ @IdProd int;

SET @IdProd = 1;

เลือก

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

คำอธิบายของตัวแปรตาราง MS SQL Server

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

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

ประโยชน์ของตัวแปรตารางใน Microsoft SQL Server

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

ข้อเสียของตัวแปรตารางใน MS SQL Server

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

ตัวอย่างการใช้ตัวแปรตารางใน Microsoft SQL Server

ตอนนี้เรามาดูการฝึกฝนกันก่อน และก่อนอื่นฉันอยากจะทราบว่าเซิร์ฟเวอร์ของฉันคือ Microsoft SQL Server 2016 Express หรืออีกนัยหนึ่งคือ การสืบค้นทั้งหมดด้านล่างทำงานบน DBMS เวอร์ชันนี้

ขั้นแรก เรามาสร้างตารางทดสอบและเติมข้อมูลทดสอบเพื่อดูว่าตัวแปรตารางสามารถใช้กับตารางปกติได้อย่างไร

สร้างตาราง TestTable (ProductId INT IDENTITY (1,1) ไม่เป็น NULL, ProductName VARCHAR (50) NULL CONSTRAINT PK_TestTable คีย์หลักคลัสเตอร์ (ProductId ASC)) GO INSERT INTO TestTable (ชื่อผลิตภัณฑ์) ค่า ("คอมพิวเตอร์"), ("จอภาพ") , ("เครื่องพิมพ์") ไปเลือก * จากตารางทดสอบ


ฉันใช้คำสั่ง CREATE TABLE เพื่อสร้างตาราง TestTable จากนั้นฉันใช้คำสั่ง INSERT ร่วมกับตัวสร้างค่าตาราง VALUES เพื่อเพิ่มข้อมูลลงในตาราง จากนั้นฉันใช้คำสั่ง SELECT เพื่อเลือกจากตารางที่สร้างขึ้นใหม่

การประกาศตัวแปรตารางและการใช้งาน

ในตัวอย่างนี้ เราจะประกาศตัวแปรตาราง เพิ่มข้อมูล และทำการเลือกจากสองตาราง ( ตัวแปรตารางและตารางปกติ) กับสหภาพ

การประกาศตัวแปรตาราง DECLARE @TableVar TABLE(ProductId INT NOT NULL, Price MONEY NULL);


--การเพิ่มข้อมูลลงในตัวแปรตาราง INSERT INTO @TableVar (ProductId, Price) VALUES (1, 500), (2, 300), (3, 200) --การใช้ตัวแปรตารางพร้อมข้อมูลรวม SELECT TTable.ProductId, TTable .ProductName , TVar.ราคาจาก @TableVar TVar LEFT เข้าร่วม TestTable TTable บน TVar.ProductId = TTable.ProductId

การสร้างตัวแปรตารางด้วยคีย์หลัก ข้อจำกัด UNIQUE และดัชนีที่ไม่เป็นคลัสเตอร์

ตัวอย่างนี้แสดงวิธีที่คุณสามารถสร้างคีย์หลัก ข้อจำกัด UNIQUE และดัชนีที่ไม่คลัสเตอร์บนตัวแปรตาราง ความสามารถในการสร้างดัชนีที่ไม่ใช่คลัสเตอร์มีให้ใช้งานตั้งแต่ Microsoft SQL Server 2014


นี่เป็นการสรุปเรื่องราวของฉันเกี่ยวกับตัวแปรตาราง หากคุณต้องการศึกษาภาษา T-SQL โดยละเอียด ฉันแนะนำให้อ่านหนังสือของฉันเรื่อง “The T-SQL Programmer's Way” ฉันหวังว่าเนื้อหานี้จะเป็นประโยชน์กับคุณ ลาก่อน!

เราจะดูในเนื้อหานี้ พื้นฐานการเขียนโปรแกรมด้วยภาษา T-SQLเราจะดูว่าเป็นภาษาประเภทใด มีความสามารถพื้นฐานอะไรบ้าง มีโครงสร้างอะไรบ้าง และแน่นอน ฉันจะให้ตัวอย่างโค้ดในกระบวนการทั้งหมดนี้

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

ภาษาโปรแกรม T-SQL

ธุรกรรม-SQL (T-SQL) เป็นส่วนขยายของภาษา SQL จาก Microsoft และใช้ใน SQL Server สำหรับการเขียนโปรแกรมฐานข้อมูล

SQL Server มีโครงสร้าง ส่วนประกอบ และฟังก์ชันมากมายที่ขยายขีดความสามารถของภาษา SQL มาตรฐาน ANSI รวมถึงการเขียนโปรแกรมแบบคลาสสิก ซึ่งแตกต่างจากการเขียนคิวรีทั่วไป

และวันนี้เราจะมาดูส่วนหนึ่งของพื้นฐานของภาษา T-SQL ซึ่งเกี่ยวข้องกับการเขียนโค้ดเพื่อใช้ฟังก์ชันบางอย่าง ( ตัวอย่างเช่นในขั้นตอนหรือฟังก์ชัน) และไม่ใช่แค่การสืบค้นฐานข้อมูลบางส่วนเท่านั้น

ตัวแปรใน T-SQL

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

มีตัวแปรสองประเภทใน T-SQL - ท้องถิ่นและทั่วโลก ตัวแปรท้องถิ่นมีอยู่เฉพาะภายในเซสชันระหว่างที่ถูกสร้างขึ้น และตัวแปรส่วนกลางถูกใช้เพื่อรับข้อมูลเกี่ยวกับเซิร์ฟเวอร์ SQL หรือข้อมูลที่เปลี่ยนแปลงบางส่วนในฐานข้อมูล

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

คุณสามารถใช้คำสั่งเพื่อกำหนดค่าให้กับตัวแปรได้ ชุดหรือ เลือก.

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

  • @@ROWCOUNT – เก็บจำนวนบันทึกที่ประมวลผลโดยคำสั่งก่อนหน้า
  • @@ERROR – ส่งคืนรหัสข้อผิดพลาดสำหรับคำสั่งสุดท้าย
  • @@SERVERNAME — ชื่อของเซิร์ฟเวอร์ SQL ในเครื่อง
  • @@VERSION - หมายเลขเวอร์ชันของ SQL Server;
  • @@IDENTITY เป็นค่าตัวนับสุดท้ายที่ใช้ในการดำเนินการแทรก ( แทรก).

ตอนนี้ เป็นตัวอย่าง เรามาสร้างตัวแปรสองตัวที่มีประเภทข้อมูล INT กำหนดค่าให้กับตัวแปรตัวแรกโดยใช้คำสั่ง SET และตัวที่สองโดยใช้คำสั่ง Select จากนั้นเพียงแสดงค่าเหล่านี้ และยังแสดงค่าของ ตัวแปร @@VERSION เช่น . ค้นหาเวอร์ชันของเซิร์ฟเวอร์ SQL

ประกาศ @TestVar1 INT ประกาศ @TestVar2 INT SET @TestVar1 = 1 SELECT @TestVar2 = 2 SELECT @TestVar1 AS [ตัวแปร 1], @TestVar2 AS [ตัวแปร 2], @@VERSION AS [เวอร์ชัน SQL Server]

แพ็คเกจ

แพ็คเกจใน T-SQL- นี่คือคำสั่งหรือคำสั่ง SQL ที่รวมเป็นกลุ่มเดียวและเซิร์ฟเวอร์ SQL จะรวบรวมและดำเนินการทั้งหมด

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

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

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


เหล่านั้น. เราเห็นว่าเรามีข้อผิดพลาดเนื่องจากไม่ได้ประกาศตัวแปร @TestVar1

เงื่อนไข

โครงสร้างเหล่านี้บ่งบอกถึงการแตกแขนงเช่น ขึ้นอยู่กับว่าตรงตามเงื่อนไขบางประการหรือไม่ตรงตามเงื่อนไข คำสั่ง T-SQL จะเปลี่ยนทิศทาง

ถ้า…อย่างอื่น

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

ประกาศ @TestVar1 INT ประกาศ @TestVar2 VARCHAR(20) SET @TestVar1 = 5 ถ้า @TestVar1 > 0 SET @TestVar2 = "มากกว่า 0" ELSE SET @TestVar2 = "น้อยกว่า 0" SELECT @TestVar2 AS [ค่า TestVar1]

หากมีอยู่

โครงสร้างนี้ช่วยให้คุณสามารถระบุการมีอยู่ของบันทึกที่กำหนดตามเงื่อนไขได้ ตัวอย่างเช่น เราต้องการทราบว่ามีบันทึกบางอย่างในตารางหรือไม่ และเมื่อตรวจพบรายการแรก การประมวลผลคำสั่งจะหยุดลง โดยพื้นฐานแล้วจะเหมือนกับ COUNT(*) > 0

ตัวอย่างเช่น เราต้องการตรวจสอบว่ามีบันทึกที่มีค่า id >=0 ในตาราง test_table หรือไม่ และจากนี้เราจะตัดสินใจว่าจะดำเนินการอย่างไร


ประกาศ @TestVar VARCHAR (20) หากมีอยู่ (SELECT * FROM test_table WHERE id > = 0) SET @TestVar = "มีบันทึก" ELSE SET @TestVar = "ไม่มีบันทึกอยู่" SELECT @TestVar AS [มีบันทึก]

กรณี

โครงสร้างนี้ใช้ร่วมกับคำสั่ง select และมีวัตถุประสงค์เพื่อแทนที่การใช้โครงสร้าง IF ซ้ำ ๆ มันมีประโยชน์ในกรณีที่คุณต้องการตรวจสอบตัวแปร ( หรือสนาม) สำหรับการมีค่าบางอย่าง


ประกาศ @TestVar1 INT ประกาศ @TestVar2 VARCHAR(20) SET @TestVar1 = 1 SELECT @TestVar2 = CASE @TestVar1 เมื่อ 1 แล้ว "หนึ่ง" เมื่อ 2 แล้ว "สอง" อื่น ๆ "ไม่ทราบ" END SELECT @TestVar2 AS [หมายเลข]

เริ่มต้น...สิ้นสุด

โครงสร้างนี้จำเป็นต่อการสร้างกลุ่มคำสั่ง เช่น ตัวอย่างเช่น หากเราต้องการดำเนินการไม่ใช่คำสั่งเดียวหลังจากบล็อก IF แต่หลายคำสั่ง เราจะต้องเขียนคำสั่งทั้งหมดภายในบล็อก BEGIN...END

มาแก้ไขตัวอย่างก่อนหน้าของเรา ( เกี่ยวกับถ้ามีอยู่) ดังนั้นหากมีระเบียน id > = 0 ในตาราง test_table นอกเหนือจากการกำหนดค่าให้กับตัวแปร @TestVar แล้ว เราจะทำการอัปเดตด้วย กล่าวคือ อัปเดตข้อมูลบางส่วนในตารางเดียวกัน และยังแสดงจำนวนแถวที่เราอัปเดตโดยใช้ตัวแปรโกลบอล @@ROWCOUNT


ประกาศ @TestVar1 VARCHAR(20) ประกาศ @TestVar2 INT SET @TestVar2 = 0 หากมีอยู่ (SELECT * FROM test_table WHERE id > = 0) BEGIN SET @TestVar1 = "มีบันทึกอยู่" อัปเดต test_table SET column1 = 5 WHERE id > = 0 SET @TestVar2 = @@ROWCOUNT END ELSE SET @TestVar1 = "ไม่มีบันทึก" SELECT @TestVar1 AS [มีบันทึก], @TestVar2 AS [แถวที่ได้รับผลกระทบ:]

ลูป T-SQL

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


ประกาศ @Cnt INT = 1, @result INT = 0, @CountRow INT SELECT @CountRow = COUNT(*) จาก test_table ในขณะที่ @Cnt<= @CountRow BEGIN SET @Cnt += 1 SET @result += 1 IF @Cnt = 20 BREAK ELSE CONTINUE END SELECT @result AS [Количество выполнений цикла:]

ในตัวอย่างนี้ ก่อนอื่นเราต้องประกาศตัวแปร ( เราเริ่มต้น Cnt และผลลัพธ์ทันที ด้วยวิธีนี้คุณสามารถตั้งค่าของตัวแปรโดยเริ่มจาก SQL Server 2008- จากนั้นเราจะค้นหาว่ามีกี่แถวในตาราง test_table และหลังจากนั้นเราตรวจสอบว่าจำนวนแถวในตารางมากกว่าหรือเท่ากับตัวนับของเราหรือไม่ จากนั้นเราจะเข้าสู่ลูปทดสอบของเรา ในวงจรเราเพิ่มค่าตัวนับ เขียนผลลัพธ์ แล้วตรวจดูใหม่ หากตัวนับของเราถึงค่า 20 แล้ว เราก็จะบังคับปิดให้ ถ้าไม่ก็ปล่อยต่อจนค่าตัวนับมากกว่าหรือเท่ากัน เป็นจำนวนแถวในตารางหรือจนถึง 20 แถวหากมีแถวในตารางมากกว่า

ความคิดเห็น

พวกเขาจำเป็นต้องอธิบายและจดบันทึกในโค้ด เพราะหากโค้ดมีขนาดใหญ่และซับซ้อน หลังจากนั้นไม่นานคุณอาจลืมไปเลยว่าทำไมถึงเป็นเช่นนี้ และทำไมคุณถึงเขียนส่วนนี้หรือส่วนนั้นของโค้ด ใน T-SQL มีความคิดเห็นบรรทัดเดียว (-Text) และความคิดเห็นหลายบรรทัด (/*Text*/)


คำสั่ง T-SQL

ไป

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


ประกาศ @Cnt INT = 0 ป้ายกำกับ: --ตั้งค่าป้ายกำกับ SET @Cnt += 1 --เพิ่ม 1 ให้กับตัวแปรถ้า @Cnt< 10 GOTO Metka --Если значение меньше 10, то переходим к метке SELECT @Cnt AS [Значение Cnt =]

รอก่อน

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


ประกาศเวลา @TimeStart, เวลา @TimeEnd SET @TimeStart = CONVERT (เวลา GETDATE())--ค้นหาเวลา WAITFOR DELAY "00:00:05"--หยุดชั่วคราวเป็นเวลา 5 วินาที SET @TimeEnd = CONVERT (เวลา GETDATE ()) )--ค้นหาเวลาอีกครั้ง --ค้นหาว่าเวลาผ่านไปนานเท่าใดในหน่วยวินาที SELECT DATEDIFF(ss, @TimeStart, @TimeEnd) AS [วินาทีที่ผ่านไป:]

กลับ

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


DECLARE @Cnt INT = 1, @result varchar(15) /*ถ้าค่าของ Cnt น้อยกว่า 0 คำสั่งต่อไปนี้จะไม่ถูกดำเนินการ และคุณจะไม่เห็นคอลัมน์ [Result:]*/ IF @Cnt< 0 RETURN SET @result = "Cnt больше 0" SELECT @result AS [Результат:]

พิมพ์

หากต้องการส่งข้อความบริการคุณสามารถใช้คำสั่ง พิมพ์- ใน Management Studio ข้อความนี้จะปรากฏในแท็บข้อความ ( ข้อความ).


ประกาศ @Cnt INT = 10, @TestVar varchar(100) IF @Cnt > 0 SET @TestVar = "ค่าของตัวแปร Cnt มากกว่า 0 และเท่ากับ " + CAST(@Cnt AS VARCHAR(10)) ElSE SET @TestVar = "ค่าของตัวแปร Cnt น้อยกว่า 0 และเท่ากับ " + CAST(@Cnt AS VARCHAR(10)) PRINT @TestVar

การทำธุรกรรม

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

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

ค้นหาสิ่งที่เรามีในตาราง (id = IDENTITY) SELECT * FROM test_table --เริ่มธุรกรรม BEGIN TRAN --ขั้นแรกให้อัปเดตข้อมูลทั้งหมด UPDATE test_table SET column1 = column1 - 5 --จากนั้นเพียงเพิ่มแถวที่มีค่าใหม่ ​​INSERT INTO test_table SELECT column1 FROM test_table --หากมีข้อผิดพลาด ให้ยกเลิกทุกอย่าง IF @@error != 0 BEGIN ROLLBACK TRAN RETURN END COMMIT TRAN --ดูว่าเกิดอะไรขึ้น SELECT * FROM test_table

ในตัวอย่างนี้ หากเรามีข้อผิดพลาดขณะเพิ่มข้อมูล (INSERT) การอัปเดตก็จะถูกยกเลิก

การจัดการข้อผิดพลาด - โครงสร้าง TRY...CATCH

ในระหว่างการดำเนินการโค้ด T-SQL สถานการณ์ที่ไม่คาดคิดอาจเกิดขึ้นได้เช่น ข้อผิดพลาดที่ต้องได้รับการจัดการ ในเซิร์ฟเวอร์ SQL เริ่มต้นด้วย SQL Server 2005 มีโครงสร้างเช่น ลอง...จับซึ่งสามารถติดตามข้อผิดพลาดได้


เริ่มต้น ลองประกาศ @TestVar1 INT = 10, @TestVar2 INT = 0, @result INT SET @result = @TestVar1 / @TestVar2 END ลอง BEGIN CATCH SELECT ERROR_NUMBER() AS [Error number], ERROR_MESSAGE() AS [Error description] END จับ

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

ฉันคิดว่านี่เพียงพอสำหรับพื้นฐานแล้ว หากคุณต้องการศึกษาโครงสร้างทั้งหมดของภาษา T-SQL ให้ละเอียดยิ่งขึ้น ฉันแนะนำให้อ่านหนังสือของฉัน” เส้นทางของโปรแกรมเมอร์ T-SQL” ซึ่งมีการพูดคุยถึงภาษา T-SQL โดยละเอียดแล้ว เสร็จแล้ว โชคดี!