sqlServer 2008 一行轉多行的問題

2022-03-06 15:13:14 字數 3026 閱讀 5545

前幾天老大發來需求,是要出個報表來著。嗯,就是一行變多行。

來貼個簡單的需求:

現有如下**

要求變成如下:

ok,因為有逗號,我首先想到的就是想辦法把逗號去掉。結果發現sql沒有提供像c#那樣split的方法,所以就自己寫了個如下:

view code

/*

***** object: userdefinedfunction [dbo].[mysplit] script date: 09/19/2012 16:52:32 *****

*/set ansi_nulls on

goset quoted_identifier on

gocreate

function

[dbo

].[mysplit]--

將以某分隔符分段的字串,按指定的順序號提取子串

(@str

nvarchar(2000),--

源字串

@snint, --

提取序號

@deli

varchar(1) --

分隔符

) returns

varchar(100

) as

begin

declare

@first

int,@last

int,@result

varchar(1000),@sn0

intselect

@sn0

=0,@first

=0,@last

=1,@str

=@str

+replicate(@deli,1

) while

@sn0

!=@sn

begin

select

@sn0

=@sn0

+1,@first

=@last,@last

=charindex(@deli,@str,@last)+

1end

if@last

-@first-1

<

0set

@result=''

else

set@result

=substring(@str,@first,@last

-@first-1

) return ( @result

) end

go

有了分開的方法,我就有了左連的想法:

view code

1

ifexists (select

*from sysobjects where name=

'cut')

2drop

proc

cut13go

4create

proc

cut15as

6select id,dbo.mysplit(txt,1,'

,') as txt,1

as sn from

pktable

7union

8select id,dbo.mysplit(txt,2,'

,') as txt,1

as sn from

pktable

9union

10select id,dbo.mysplit(txt,2,'

,') as txt,1

as sn from

pktablee

11order

byid,txt,sn

12go

1314

exec cut1

結果是出來了,但是確是有不少空白欄位的。大家可以試一下,這裡就不再多說了

查查資料啊,各種問啊。終於尋到乙個很神奇的辦法哈

view code

1

select

2a.id,b.txt

3from

4 (select id,txt=

convert(xml,''+

replace(txt,'

,','

')+'

') from

pktable)a

5outer

6 (select txt=c.v.value('

.','

nvarchar(100)

') from a.txt.nodes('

/root/v

')c(v))b

ok 很成功!**簡潔 功能實現!

是的,哥們兒。我這裡用到了sql xml

我用節點符號替換了逗號,然後用 c.v.value通過節點把他分離顯示

來來,大家討論下,第一次用,不是太熟,多多指教。

可以用:cte

效率比 xml法快

1

with t (id,p1,p2) as2(

3select id,charindex('

,',','

+name),charindex('

,',name+',

')+1from#t4

unionall

5select a.id,b.p2,charindex('

,',name+',

',b.p2)+1from #t a join t b on a.id=b.id where

charindex('

,',name+',

',b.p2)>06

)7select a.id,name=

substring(a.name+',

',b.p1,b.p2 - b.p1 -

1) from #t a join t b on a.id=b.id orderby1

SQL server 2008 學習筆記(一)

資料庫的基本操作分類 1 資料庫的查詢及查詢語句 2 資料庫資料修改 select union 單獨資料的查詢 表示任意0個或多個字元 oracle sqlserver mysql 支援支援支援 select from 表名 where 列名 like 查詢出全部 select from 表名 wh...

Sql Server 2008 收縮日誌

收縮日誌 alter database dnname set recovery with no wait goalter database dnname set recovery 簡單模式 gouse dnname godbcc shrinkfile n dnname log 11,truncate...

徹底解除安裝sql server2008

微軟的開發工具在按裝和解除安裝時都讓人頭疼,只能是裝在c盤,裝在其他盤時最容易出事 在重新按裝的時候一定要把以前的例項解除安裝完才行。要不就會出錯。在解除安裝sql server後,其實還沒有完成,還要把登錄檔資訊完全刪乾淨,下面就將教您徹底刪除sql server登錄檔的方法,供您參考。在解除安裝...