預存程序NOT IN(如何傳入變數)


T-SQL  not in 語法括號中可以指定篩選值, 如下:

select * from mytable1 where mycol1 in ( 'AAA','BBB' )

若撰寫成預存程序, 且希望 'AAA', 'BBB' 是由預存參數傳入,
未經處理直接傳入是無效的

declare @sysno varchar(100)
SET @sysno='AAA,BBB'

select * from mytable1 where mycol1 in (@sysno) // 這是不對的


解決方式1
使用 charindex 函式

declare @sysno varchar(100)
SET @sysno='AAA,BBB'

select * from mytable where charindex(mycol1 ,@sysno)>0

解決方式2
建立一個 Function 將字串分隔後回傳Table
利用回傳的Table, 置入 not in 中, 語法如下:

CREATE FUNCTION [dbo].[ufn_SplitToTable]
( @InputString nvarchar(4000)
)
RETURNS
@tblReturn TABLE (COL1 nvarchar(60))

AS
BEGIN
    DECLARE @CIndex smallint
    WHILE (@InputString<>'')
    BEGIN
        SET @CIndex=CHARINDEX(',',@InputString)
        IF @CIndex=0 SET @CIndex=LEN(@InputString)+1
     
        --透過substring函數取得第一個字串,並輸入資料表變數中
        INSERT INTO @tblReturn (COL1)
        VALUES (SUBSTRING(@InputString,1,@CIndex-1))
     
        IF @CIndex=LEN(@InputString)+1 BREAK
        SET @InputString=SUBSTRING(@InputString,@CIndex+1,LEN(@InputString)-@CIndex)
    END
    RETURN
END