日期:2014-05-18  浏览次数:20431 次

一道捆饶好久的问题,请高手帮忙
怎么写个数据库函数 
a-b |a-b |a-b |.... 
1-1 |7-2 |8-3 |..... 
如何取出b最后一个值也就是3
或用什么样的查询语句可以查询出来?

------解决方案--------------------
CREATE Function dbo.f_GetStr
(
@s varchar(8000), --包含多个数据项的字符串
@pos int, --要获取的数据项的位置
@split varchar(10) --数据分隔符
)RETURNS varchar(100)
AS
Begin
IF @s IS NULL RETURN(NULL)

Declare @splitlen int

Select @splitlen = LEN(@split + 'a') - 2
WHILE @pos > 1 AND CHARINDEX(@split,@s+@split) > 0
SELECT @pos=@pos-1,
@s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
End
------解决方案--------------------
CREATE TABLE t
(
ID INT IDENTITY(1,1),
COL VARCHAR(200)
)

INSERT INTO T
 SELECT '1-1 | 7-2 | 8-3 | 4-6'

DECLARE @t TABLE 
( id INT IDENTITY(1,1) NOT NULL, COL VARCHAR(30) )

INSERT INTO @t(COL)
 SELECT TOP 200 0 FROM sysobjects

 SELECT ID, 
[L] = LTRIM(RTRIM(LEFT(COL,CHARINDEX('-',COL)-1))),
[R]= LTRIM(RTRIM(STUFF(COL,1,CHARINDEX('-',COL),'')))
 FROM(
 SELECT A.ID,COL = LTRIM(RTRIM(SUBSTRING(A.COL, b.id, CHARINDEX('|',A.COL+'|',B.ID)-B.ID)))
FROM T A,@t B
WHERE B.ID < LEN(A.COL) AND CHARINDEX('|','|'+A.COL,B.ID) = B.ID
 ) A
 

DROP TABLE T

ID L R
----------- ----------- ----------- 
1 1 1
1 7 2
1 8 3
1 4 6