02/10/2018, 00:35

[Sqlserver] Hướng dẫn cách truyền nhiều giá trị vào parameter trong Store Procedure

Bài viết hôm nay, mình sẽ hướng dẫn các bạn cách truyền nhiều giá trị vào Parameter trong Store Procedure trongSqlserver . Mình có một ví dụ như sau: create table dummy (id int,name varchar(100),DateJoining Datetime, departmentIt int) insert ...

Bài viết hôm nay, mình sẽ hướng dẫn các bạn cách truyền nhiều giá trị vào Parameter trong Store Procedure trongSqlserver.

Mình có một ví dụ như sau:

create table dummy (id int,name varchar(100),DateJoining Datetime, departmentIt int)

insert into dummy values (1,'John','2012-06-01 09:55:57.257',1);
insert into dummy  values(2,'Amit','2013-06-01 09:55:57.257',2);
insert into dummy  values(3,'Naval','2012-05-01 09:55:57.257',3);
insert into dummy  values(4,'Pamela','2012-06-01 09:55:57.257',4);
insert into dummy  values(5,'Andrea','2012-09-01 09:55:57.257',3);
insert into dummy  values(6,'Vicky','2012-04-01 09:55:57.257',4);
insert into dummy  values(7,'Billa','2012-02-01 09:55:57.257',4);
insert into dummy  values(8,'Reza','2012-04-01 09:55:57.257',3);
insert into dummy  values (9,'Jacob','2011-05-01 09:55:57.257',5);

Ta có dữ liệu trên bây giờ mình sẽ chạy hàm Store Procedure như sau:

declare @startdate1 varchar(100) ='20120201'
declare @enddate1 varchar(100)='20130601'
declare @dptId varchar(100)='3,4'

select * 
from dummy
where DateJoining >= @startdate1 and DateJoining < @enddate1 
  and departmentIt IN (@dptId);

Trong có có tham số truyền vào là @dptId.

Vấn đề là nằm ở đây: 

Khi các bạn sử dụng câu lệnh IN trong store procedure sqlserver để truyền nhiều giá trị.

VD:

DECLARE @dptId  varchar(50)

SET @dptId = 'John, Jacob'

Nhưng mặc định, Store Procedure chỉ hiểu đó là một kiểu varchar. Nên bạn sẽ không thể truy vấn được. 

Thì các bạn sẽ không thể lấy được dữ liệu ra từ: John và Jacob.

* Đây là cách mình tìm hiểu được bằng cách tạo ra một funciton fn_split như sau: 

CREATE  FUNCTION 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

- Sau đó, các bạn chạy lại câu lệnh sau:

declare @startdate1 varchar(100) ='20120201'
declare @enddate1 varchar(100)='20130601'
declare @dptId varchar(100)='3,4'

select * from dummy
where DateJoining >=@startdate1 and DateJoining < @enddate1 
  and departmentID IN (SELECT Value FROM fn_Split(@dptId, ','));

* Tuy nhiên đây chưa phải là cách hay, nếu các bạn nào biết có thể chia sẽ cho chúng mình cùng học tập.

Have Fun :)

Tags:
0