วิธีการส่งรายการที่คั่นด้วยลูกน้ำไปยัง Stored Procedure ใน Sybase
เมื่อทำงานกับฐานข้อมูล คุณอาจเจอสถานการณ์ที่ต้องส่งพารามิเตอร์หลายตัวไปยัง stored procedure ใน Sybase โดยเฉพาะ คุณอาจพบปัญหาเมื่อพยายามส่ง comma separated list ของสตริง บทความนี้จะกล่าวถึงปัญหานี้และแนะนำโซลูชันอย่างละเอียดทีละขั้นตอน
ปัญหา
ลองนึกภาพว่าคุณมี stored procedure ดังนี้:
CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
SELECT * FROM mytbl WHERE name IN (@keyList)
คุณต้องการเรียกใช้งาน stored procedure นี้ด้วยชื่อหลายชื่อ เช่น 'John'
และ 'Tom'
อย่างไรก็ตาม เมื่อคุณลองใช้วิธีต่าง ๆ เพื่อติดต่อรายการนี้ คุณจะพบปัญหา:
exec getSomething 'John' -- ใช้ได้ แต่มีค่าเพียง 1 ค่า
exec getSomething 'John','Tom' -- ใช้ไม่ได้; คาดว่าจะมีสองตัวแปร
exec getSomething "'John','Tom'" -- ใช้ไม่ได้; ไม่พบข้อมูลใด ๆ
exec getSomething '"John","Tom"' -- ใช้ไม่ได้; ไม่พบข้อมูลใด ๆ
exec getSomething '\'John\',\'Tom\'' -- ใช้ไม่ได้; เกิดข้อผิดพลาดในการเขียนโปรแกรม
ดังที่เห็น มันเป็นปัญหาที่จะส่งรายการที่คั่นด้วยลูกน้ำโดยตรง ดังนั้นมีวิธีแก้ปัญหาอย่างไร?
วิธีแก้ปัญหา
ใน Sybase 12.5 และเวอร์ชันก่อนหน้านี้ ตัวเลือกของคุณมีข้อจำกัดเนื่องจากคุณไม่สามารถใช้ฟังก์ชันโดยตรงเพื่อแบ่งสตริง อย่างไรก็ตาม มีวิธีแก้ที่ใช้การสร้างตารางชั่วคราวเพื่อเก็บค่าของคุณ
การใช้ตารางชั่วคราว
-
สร้างตารางชั่วคราว เพื่อเก็บค่าจากรายการที่คั่นด้วยลูกน้ำของคุณ ตัวอย่างเช่น:
CREATE TABLE #TempNames (Name VARCHAR(100))
-
แทรกค่าไปยังตารางชั่วคราว โดยใช้วิธีในการแบ่งรายการของคุณ วิธีหนึ่งที่คุณอาจต้องทำด้วยตนเอง เพราะ Sybase ไม่มีฟังก์ชันแบ่งสตริงในตัว มีดังนี้:
- คุณอาจต้องใช้ SQL แบบไดนามิกหรือเขียนลอจิกที่กำหนดเองเพื่อนำค่าของคุณไปยังตาราง
#TempNames
- ขึ้นอยู่กับแอปพลิเคชันของคุณหรือเวอร์ชันของ Sybase ให้พิจารณาเขียนสคริปต์เพื่อวนซ้ำผ่านรายการและแทรกแต่ละรายการแยกกัน
- คุณอาจต้องใช้ SQL แบบไดนามิกหรือเขียนลอจิกที่กำหนดเองเพื่อนำค่าของคุณไปยังตาราง
-
ดึงข้อมูลจากตารางชั่วคราว ใน stored procedure ของคุณ คุณสามารถปรับปรุง stored procedure ของคุณให้มีลักษณะดังนี้:
CREATE PROCEDURE getSomething AS BEGIN DECLARE @sqlCommand VARCHAR(4096) SET @sqlCommand = 'SELECT * FROM mytbl WHERE name IN (SELECT Name FROM #TempNames)' EXEC(@sqlCommand) -- เรียกใช้งาน SQL แบบไดนามิก END
-
เรียกใช้ procedure ของคุณ หลังจากแทรกข้อมูลลงในตารางชั่วคราวของคุณ:
INSERT INTO #TempNames VALUES ('John'), ('Tom') EXEC getSomething
ข้อควรพิจารณาเพิ่มเติม
- การทำความสะอาด: อย่าลืมลบตารางชั่วคราวเมื่อเสร็จสิ้นเพื่อหลีกเลี่ยงความยุ่งเหยิงในสภาพแวดล้อมฐานข้อมูลของคุณ
DROP TABLE #TempNames
- เวอร์ชันของ Sybase: หากคุณใช้เวอร์ชันที่ใหม่กว่าของ Sybase ให้สำรวจวิธีการหรือฟีเจอร์ใหม่ ๆ ที่อนุญาตให้จัดการสตริงและพารามิเตอร์ได้
สรุป
การส่ง comma separated list ไปยัง stored procedure ใน Sybase อาจดูน่ากลัวในตอนแรก แต่การใช้ตารางชั่วคราวช่วยให้มีวิธีการที่ตรงไปตรงมา วิธีนี้ช่วยให้คุณจัดการพารามิเตอร์หลาย ๆ ตัวได้โดยไม่ประสบปัญหาทางไวยากรณ์ เมื่อใดก็ตามที่คุณพบความท้าทายที่คล้ายกัน ให้จดจำคู่มือนี้และอย่าลังเลที่จะปรับแต่งให้เหมาะกับความต้องการของคุณ
โดยมุ่งเน้นไปที่ขั้นตอนเหล่านี้ คุณสามารถเพิ่มประสิทธิภาพการทำงานของ stored procedures ของคุณและปรับปรุงการทำงานภายใน Sybase ขอให้สนุกกับการเขียนโค้ด!