2011年8月12日 星期五

一對多的資料表串接成一個欄位

原因:我要組成一張view,但是關聯是一對多的資料表,這時要將其中一個欄位用分隔符號串成一個欄位。看例子會比較好懂。

例子:如下圖是參考資料(Reference)以及實體檔案(RFile)的關聯表,一筆參考資料,將有多個實體檔,現在我要將這兩張表串成一張view,而且rid不能重複,FileName用分號作區隔串成一個欄位。



方法:將FileName用分號作區隔串接成一個字串,需要利用ms sql的純量值函數,來定義串接的function,如下圖。


傳統作法是用sql的while和point去將FileName一個一個取出來。不過今天發現一個更快的作法,直接執行下面這段sql,即可產生純量值函數。COALESCE和STUFF為sql原生函數,google很容易查到,不在此描述。

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO



CREATE FUNCTION [dbo].[GetRFileName]  --函數名稱

(

    --輸入參數

    @Rid int    

)

RETURNS nvarchar(3000)  

AS

BEGIN

    --宣告變數

    DECLARE @HandleRid nvarchar(3000)

    --串接FileName

    SELECT @HandleRid = COALESCE(@HandleRid,'') + ';' + [FileName] from RFile where RId =@Rid

    RETURN STUFF(@HandleRid, 1, 1, '')

END


建立完成後,我們就可以下此sql
SELECT RId,Title,Content,PublishDate,dbo.GetRFileName(RId)
FROM Reference