2012年7月25日 星期三

T-SQL 學習紀錄(1)

下sql command的時候,有時候多麼希望條件可以動態產生
如果使用程式的方式是非常容易的
但是在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

沒有留言:

張貼留言