利用xml改造以前在2000下的合并相同项目的函数

------------------------------------

-- Author:  happyflystone 

-- Date:2008-11-23 22:17:36

-- Description:利用xml改造以前在2000下的合并相同项目的函数

------------------------------------

 

--  运行环境:

 

SELECT @@version

/*

-------------------------------------------------

Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)

    Apr 14 2006 01:12:25

    Copyright (c) 1988-2005 Microsoft Corporation

    Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

(1 行受影响)

*/

-- Test Data: TA

IF OBJECT_ID('TA') IS NOT NULL

    DROP TABLE TA

GO

CREATE TABLE TA(ID INT,DATA VARCHAR(50))

INSERT TA VALUES(1,'aa')

INSERT TA VALUES(1,'bb')

INSERT TA VALUES(1,'cc')

INSERT TA VALUES(2,'eee')

INSERT TA VALUES(2,'fff')

 

GO

 

-- 先来看看一个合并的例子:

 

CREATE FUNCTION F_STR(@ID INT)

RETURNS VARCHAR(100)

AS

BEGIN

    DECLARE @S VARCHAR(100)

    SELECT @S = ISNULL(@S+',','')

                   +DATA

     FROM TA

     WHERE ID = @ID

    RETURN @S

END

GO

SELECT ID,DBO.F_STR(ID) AS COL

FROM TA

GROUP BY ID

/*

ID             COL

----------- ----------------------------

1           aa,bb,cc

2           eee,fff

 

*/

DROP FUNCTION F_STR

GO

 

 

-- 下面我们利用XML来合并相同项,我们创建一个合并同类项的函数。

 

CREATE FUNCTION F_STR(@ID int)

RETURNS VARCHAR(100)

AS

BEGIN

     DECLARE @x XML,@ret VARCHAR(100)

     SET @x=

          (SELECT DATA

          FROM TA

          WHERE ID = @ID

              FOR XML PATH(''),ROOT('v'));

     SELECT @ret = CAST(

                            @x.query('

                                 <v>

                                  { for $i in //DATA

                                     return concat(string($i),",")

                                  }

                                 </v>').value('/v[1]','VARCHAR(100)')

                            AS VARCHAR(100))

    RETURN @ret

END

GO

 

-- 运行及结果,并删除函数

 

SELECT ID,DBO.F_STR(ID) AS COL

FROM TA

GROUP BY ID

/*

ID             COL

----------- ----------------------------

1           aa,bb,cc

2           eee,fff

 

*/

DROP FUNCTION F_STR

 

 

 

-- 最后我贴上经常使用XML语法合并同类项一般SQL写法:

-- 1 (AUTO):

 

SELECT

     ID,

     [VALUES]=STUFF(REPLACE(REPLACE((SELECT DATA

                                          FROM TA

                                          WHERE ID=T.ID FOR XML AUTO),

                                          '"/><TA DATA="',','),

                                 '"/>',''),1,10,'')

FROM TA T

GROUP BY ID

 

-- 2:(OUTER APPLY,AUTO)

 

SELECT *

FROM(

    SELECT DISTINCT

        id

    FROM ta

)A

OUTER APPLY(

    SELECT

        [bbb]= STUFF(REPLACE(REPLACE(

            (

                SELECT data FROM ta N

                WHERE id = A.id

                FOR XML AUTO

            ), '<N data="', ','), '"/>', ''), 1, 1, '')

)N

 

-- 3:(PATH)

 

SELECT

     ID,

     [VALUES]=STUFF((SELECT ','+LTRIM(DATA)

                       FROM TA T

                       WHERE ID=TA.ID FOR XML PATH('')), 1, 1, '')

FROM TA

GROUP BY ID

 

 

-- 上面的SQL运行结果都是一样,如下:

 

/*

ID         

----------- ----------------------------

1           aa,bb,cc

2           eee,fff

 

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值