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: T-SQL