博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用户自定义函数代替游标进行循环拼接
阅读量:5974 次
发布时间:2019-06-19

本文共 2365 字,大约阅读时间需要 7 分钟。

首先,建立测试表,本例我们采用经典的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

 

 

转载地址:http://cpbox.baihongyu.com/

你可能感兴趣的文章
Oracle 实现行转列
查看>>
如何使用 Idea 远程调试 Java 代码
查看>>
VMware虚拟化技术之二vCenter Server5.5u1部署
查看>>
ExchangeServer2010行为管理之二(需审批才可发送外部邮件)
查看>>
mysql数据库root用户密码重设
查看>>
如何最快地批量执行音视频转码
查看>>
Debian利用iso搭建本地软件源
查看>>
Linux -- 安装Java
查看>>
我的友情链接
查看>>
Android网络编程之TCP/IP的Socket、ServerSocket模式
查看>>
tomcat下的日志配置详细说明
查看>>
【重新分配分片】Elasticsearch通过reroute api重新分配分片
查看>>
PBR策略路由实例
查看>>
图片居中显示
查看>>
新浪微博PHP7升级实践
查看>>
选择排序
查看>>
认识Linux文件系统
查看>>
当Google谈论机器学习时,世界将会更美好?
查看>>
虚拟化--060 vsphere-vmfs5分区恢复
查看>>
看看我属于哪种月饼
查看>>