T-SQL 預存程序 not in ( 如何傳入變數 )

  • 9104
  • 0

T-SQL 預存程序 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
 
GO

 

測試一下結果

 

declare @sysno varchar(100)
SET @sysno='AAA,BBB'
 
select * from mytable1
where mycol1 in ( select * from dbo.ufn_SplitToTable(@sysno) )
 

這個老問題有沒有更好的解法? 目前有筆者找到這 2 種選擇

以上部份參考來源: http://mydiamond.pixnet.net/blog/post/22415645-sql-split

 

Dotblogs Tags: