如果使用程式的方式是非常容易的
但是在T-SQL有限的能力下,是非常複雜的!!
但是為了要使用pivot這個好用的功能
不得不要寫一個stored procedure來達成
SELECT * FROM dbo.table WHERE column IN (xxxxxx)
重點就在於xxxx要如何動態產生
stackoverflow真是好網站,什麼奇怪的問題都有人問
還引發一連串的討論
以下是我使用的方法
首先先寫一個function存起來
CREATE FUNCTION [dbo].[fnSplit](
@sInputList VARCHAR(8000) -- List of delimited items
, @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))
BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
SELECT
@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))
IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem
END
IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
透過這個function就可以將一連串的字串拆開啦!!
使用方式
SELECT item from fnSplit(@tags, ‘|’)
如果套用在code當中,就會如同下面的頁面
DECLARE @tags
SET @tags = ‘ruby|rails|scruffy|rubyonrails’
select * from Tags where Name in (SELECT item from fnSplit(@tags, ‘|’))
order by Count desc
ref:
http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause