2010年2月11日 星期四

[SQL].列資料轉成欄資料

目的:
分享一個 T-Sql 句子, 把列裡的資料, 轉成欄位裡.

當有一筆資料, 某一個欄位是做一對多 (例如: checkbox), 想要把 的那些資料一口氣串在 的那一筆的某個欄位裡, 可以試看看這樣做.


執行畫面:

1. 原始資料如下:
SQL: select * from testTable



2. 把列資料轉成欄資料:
SQL:
select * from testTable
DECLARE @SQL Varchar(max)
select @SQL=''
SELECT @SQL=@SQL + '' + convert(varchar(20),id) + ','
FROM testTable
select @SQL


幫 function 整理及包裝一下後, 就可以用
SQL: select [dbo].[fn_getTestTitles]('1,3')
來取出第id=1及3 這2筆的資料.


包裝了2個 function 如下:
CREATE FUNCTION [dbo].[fn_getTestTitles](@myData varchar(200))
RETURNS nvarchar(2000)
AS
BEGIN
DECLARE @SQL Varchar(max)
select @SQL=''
SELECT @SQL=@SQL + '' + title + char(13) + char(10)
FROM testTable
where id in (select data from dbo.fn_slip_str(@myData,','))
RETURN (@SQL)
END


Create Function fn_slip_str( @InStr nvarchar(2000) , @s_char nvarchar(1) )
Returns @tb Table ( sno int , data nvarchar(100) )
As
Begin
Set @InStr = @s_char + @InStr + @s_char;
Declare @p1 Int , @p2 Int , @data nvarchar(100) , @sno int;
Set @p1 = -1 ; Set @p2 = -1 ; Set @data = '' ; Set @sno = 0;
While ( 0 Not In (@P1,@P2) ) Begin
Set @p1 = CharIndex(@s_char,@InStr,@p1+1);
Set @p2 = CharIndex(@s_char,@InStr,@p1+1);
If ( 0 In (@p1,@p2) )
Break;
Set @data = SubString(@InStr,@p1+1,@p2-@p1-1);
if ( @data <> '' ) Begin
Set @sno = @sno +1;
Insert Into @tb ( sno , data ) Values ( @sno , @data )
End
End
Return
End


相關文章:

沒有留言:

張貼留言

Facebook 留言板