前幾天老大發來需求,是要出個報表來著。嗯,就是一行變多行。
來貼個簡單的需求:
現有如下**
要求變成如下:
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
1ok 很成功!**簡潔 功能實現!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
是的,哥們兒。我這裡用到了sql xml
我用節點符號替換了逗號,然後用 c.v.value通過節點把他分離顯示
來來,大家討論下,第一次用,不是太熟,多多指教。
可以用:cte
效率比 xml法快
1with 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登錄檔的方法,供您參考。在解除安裝...