我們在處理查詢SQL的包含in 或not in時,一般都是這樣寫的,in(1,2) 或in('1','2');但是今天我在做遊標循環時,發現傳入ids參數無法執行。
效果大概這樣 :select * from tab where id in('1,2');導致數據執行不了,那麼如何處理這種情況呢?
--正常查詢sql中in的條件 select * from Teacher where id in(1,2); --異常查詢sql中in的條件 select * from Teacher where id in('1,2');
正常查詢結果集,如下:
異常查詢結果集,如下:
那麼,如何處理方法或存儲過程傳入參數類似 ‘1,2’的值呢,那我們需要進行一個方法處理,返回一個表形式
--把一串字符串分割成單列表形式 如 '1,2,3' 變成 --TB_V --1 --2 --3 --- CREATE FUNCTION New_StringSplit ( @STR NVARCHAR(MAX)='', @SPLITER NVARCHAR(20)='') RETURNS @TB TABLE(TB_V NVARCHAR(200)) AS BEGIN DECLARE @NUM INT, @POS INT,@NEXT_POS INT SET @NUM=0 SET @POS=1 WHILE (@POS <=LEN(@STR)) BEGIN SELECT @NEXT_POS=CHARINDEX(@SPLITER,@STR,@POS) IF (@NEXT_POS=0 OR @NEXT_POS IS NULL) --BEGIN SELECT @NEXT_POS=LEN(@STR)+1 INSERT INTO @TB VALUES(RTRIM(LTRIM(SUBSTRING(@STR,@POS,@NEXT_POS-@POS)))) SELECT @POS=@NEXT_POS +1 --END END RETURN END
執行創建函數後,我們的sql語句變成這樣就可以了
--使用函數New_StringSplit處理後的sql select * from Teacher where id in(select * from New_StringSplit('1,2',','));
效果也出來了,如下