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

本文介绍如何在 SQL Server 中使用 XML 来合并具有相同 ID 的记录数据。通过创建函数实现数据合并,并提供了几种不同的 SQL 实现方法。

------------------------------------<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

-- 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、付费专栏及课程。

余额充值