用户自定义函数代替游标进行循环拼接

首先,建立测试表,本例我们采用经典的Customer 1-->n Order结构,如下:

ExpandedBlockStart.gif 代码
USE  test
GO

IF   EXISTS  ( SELECT   1   FROM  sysobjects  WHERE  name  =   ' Orders ' )
    
DROP   TABLE  Orders
    
IF   EXISTS  ( SELECT   1   FROM  sysobjects  WHERE  name  =   ' Customers ' )
    
DROP   TABLE  Customers
    
/*
    Customer 1 --> n Order
*/

--  Create Customer Table
CREATE   TABLE  Customers
(
    CustomerId 
UNIQUEIDENTIFIER   PRIMARY   KEY ,
    Name 
VARCHAR ( 25 ),
)
GO


--  Create Order Table
CREATE   TABLE  Orders
(
    OrderId 
UNIQUEIDENTIFIER   PRIMARY   KEY ,
    Name 
VARCHAR ( 255 ),
    Customer_Id 
UNIQUEIDENTIFIER   FOREIGN   KEY   REFERENCES  Customers(CustomerId)
)
GO

 

 

然后,插入一些测试数据:

 

ExpandedBlockStart.gif 代码
--  insert test data for customers table
INSERT   INTO  Customers
VALUES ( ' 65DC24EF-BA13-4707-95B0-3D426C2FD0A0 ' , ' C1 ' )

INSERT   INTO  Customers
VALUES ( ' 32AA5A01-39B4-42D0-BEE9-9AF64171EB55 ' , ' C2 ' )
GO


--  insert test data for orders table
INSERT   INTO  Orders
VALUES ( ' 8EAA07D0-0E04-412A-8A60-3178C9C2E205 ' , ' O1 by C1 ' , ' 65DC24EF-BA13-4707-95B0-3D426C2FD0A0 ' )

INSERT   INTO  Orders
VALUES ( ' 78E0CDAB-A3FA-4317-9D4E-D884F91D41A8 ' , ' O2 by C2 ' , ' 32AA5A01-39B4-42D0-BEE9-9AF64171EB55 ' )

INSERT   INTO  Orders
VALUES ( ' D08038A9-94FB-4AFF-9E41-F8BEE0FD4384 ' , ' O3 by C1 ' , ' 65DC24EF-BA13-4707-95B0-3D426C2FD0A0 ' )

INSERT   INTO  Orders
VALUES ( ' 7487AE08-6313-4DB7-87D7-8F9204F07470 ' , ' O4 by C2 ' , ' 32AA5A01-39B4-42D0-BEE9-9AF64171EB55 ' )

INSERT   INTO  Orders
VALUES ( ' 49A76769-D074-4AF3-9707-751D34847E2A ' , ' O5 by C1 ' , ' 65DC24EF-BA13-4707-95B0-3D426C2FD0A0 ' )

INSERT   INTO  Orders
VALUES ( ' C5C055EB-49A7-4E4C-82EA-1DB10933C78D ' , ' O6 by C2 ' , ' 32AA5A01-39B4-42D0-BEE9-9AF64171EB55 ' )

GO

 

 

建立自定义函数:

 

ExpandedBlockStart.gif 代码
IF   EXISTS  ( SELECT   1   FROM  sysobjects  WHERE  name  =   ' fnGetCustomerOrders ' )
    
DROP   FUNCTION  fnGetCustomerOrders

CREATE   FUNCTION  fnGetCustomerOrders
(
    
@CustomerName   VARCHAR ( 25 )
)
    
RETURNS   VARCHAR ( MAX )

AS  

BEGIN
    
DECLARE   @result   VARCHAR ( MAX )
    
SET   @result   =   ''
    
SELECT   @result   =   @result   +   ' '   +  o.Name
    
from  Customers c  INNER   JOIN  Orders o
            
ON  c.CustomerId = o.Customer_Id
    
WHERE  c.Name = @CustomerName
    
ORDER   by  c.Name, o.Name

    
IF   @result   like   ' , % '
        
SET   @result   =   right ( @result len ( @result -   2 )

    
RETURN   @result
END

GO

 

 

测试函数:

 

--  test function
DECLARE   @customer_name   VARCHAR ( 25 )
SET   @customer_name = ' C1 '
SELECT   ' Orders By  '   +   @customer_name   +   ' '   +  dbo.fnGetCustomerOrders( @customer_name )

GO

 

 

结果如下:

Orders By C1: O1 by C1, O3 by C1, O5 by C1

 

 

转载于:https://www.cnblogs.com/davidgu/archive/2010/05/17/1737374.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值