วันพฤหัสบดีที่ 3 กรกฎาคม พ.ศ. 2557

Developer TIP ตอน Split ใน Store procedure

สำหรับการพัฒนาโปรแกรม ติดต่อฐานข้อมูล Store Procedure เป็นสิ่งที่ขาดไม่ได้ สิ่งหนึ่งที่ปัญหาง่ายๆ แต่เป็นปัญหาคือการทำ IN ใน Store Procedure ที่มักจะเกิดปัญหาว่า มันทำไม่ได้ตามต้องการ ทีนี้จะทำยังไง วิธีการนึงที่ผมใช้คือการสร้างฟังก์ชัน Split เข้ามาใน User - Define Function โดยมีโค้ดดังนี้
CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(   
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)  
)
AS
BEGIN

DECLARE @index int
SET @index = -1

WHILE (LEN(@text) > 0)
  BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
      BEGIN  
        INSERT INTO @Strings VALUES (@text)
          BREAK 
      END 
    IF (@index > 1) 
      BEGIN  
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))  
        SET @text = RIGHT(@text, (LEN(@text) - @index)) 
      END 
    ELSE
      SET @text = RIGHT(@text, (LEN(@text) - @index))
    END
  RETURN
END

โค้ดข้างต้นคือการสร้าง function สำหรับ Split ค่า String เพื่อให้สามารถใช้ใน IN Operation ในการ Query สำหรับ Stored Procedure ได้ 
การใช้งานกก็คือนำไปใส่ใน IN เท่านั้น ตัวอย่าง

CREATE PROCEDURE [dbo].[sp_TRANS]
@p_DateStart AS datetime,
@p_DateFinish As datetime,
@p_clstype as varchar(255)
AS
BEGIN
SELECT 
item_name,
transaction_date

 
FROM tb_buy_item

WHERE transaction_date BETWEEN @p_DateStart and @p_DateFinish
AND item_type IN (select value from fn_Split(@p_clstype, ',')) 
ORDER BY T.TRANS_ID ASC



END

หวังว่าจะเป็นประโยชน์กับ Developer ทุกท่านครับ 

ไม่มีความคิดเห็น:

แสดงความคิดเห็น