[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 :)