讲解SQL Server2005数据项的分拆与合并
作者:Victor 发布时间:2009-01-04 14:40:00
SQL Server2005数据项的分拆与合并:
参考示例如下:
-- =============================================
-- Author: LzmTW
-- Create date: 20080102
-- Description: 连接子字符串
-- @TableName: 数据所在的表的名称
-- @KeyColName: 连接子字符串所依据的键值所在的列
-- @JoinColName: 包含要连接的子字符串所在的列
-- @Quote: 分隔子字符串
-- @Where: 选择条件,不包含Where
-- =============================================
CREATE PROCEDURE [Helper].[JoinValue]
@TableName nvarchar(100)
,@KeyColName nvarchar(20)
,@JoinColName nvarchar(20)
,@Quote nvarchar(10) = N','
,@Where nvarchar(max) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@SQL nvarchar(max)
IF @Where IS NULL
SET @SQL = N'
SELECT *
FROM
(
SELECT DISTINCT KeyCol = @KeyColName
FROM @TableName
)a
'
ELSE
SET @SQL = N'
SELECT *
FROM
(
SELECT DISTINCT KeyCol = @KeyColName
FROM @TableName
WHERE @Where
)a
'
SET @SQL = @SQL + N'
OUTER APPLY (
SELECT NewValues =
STUFF(
REPLACE(
REPLACE(
REPLACE(
(
SELECT JoinCol = @JoinColName
FROM @TableName b
WHERE @KeyColName = a.KeyCol
FOR XML RAW
)
, N'''', N'''')
, N'', N''"/>'', N'''')
, 1, LEN(N''@Quote''), N'''')
) c'
SET @SQL = REPLACE(@SQL, N'@TableName', @TableName)
SET @SQL = REPLACE(@SQL, N'@KeyColName', @KeyColName)
SET @SQL = REPLACE(@SQL, N'@JoinColName', @JoinColName)
SET @SQL = REPLACE(@SQL, N'@Quote', @Quote)
IF NOT @Where IS NULL
SET @SQL = REPLACE(@SQL, N'@Where', @Where)
--PRINT @SQL
EXEC sp_executesql @SQL
END
GO
-- =============================================
-- Author: LzmTW
-- Create date: 20080102
-- Description: 分拆字符串
-- @TableName: 数据所在的表的名称
-- @KeyColName: 分拆为子字符串所依据的键值所在的列
-- @SpliteColName: 包含要分拆的字符串所在的列
-- @Quote: 分隔子字符串
-- @Where: 选择条件,不包含Where
-- =============================================
CREATE PROCEDURE [Helper].[SpliteValues]
@TableName nvarchar(100)
,@KeyColName nvarchar(20)
,@SpliteColName nvarchar(20)
,@Quote nvarchar(10) = N','
,@Where nvarchar(max) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@SQL nvarchar(max)
IF @Where IS NULL
SET @SQL = N'
SELECT
KeyCol, NewValue
FROM
(
SELECT
KeyCol = @KeyColName
,SpliteCol = CONVERT(xml, N'''' + REPLACE(@SpliteColName, N''@Quote'', N'''') + N'''')
FROM @TableName
) a
'
ELSE
SET @SQL = N'
SELECT
KeyCol, NewValue
FROM
(
SELECT
KeyCol = @KeyColName
,SpliteCol = CONVERT(xml, N'''' + REPLACE(@SpliteColName, N''@Quote'', N'''') + N'''')
FROM @TableName
WHERE @Where
) a
'
SET @SQL = @SQL + N'
OUTER APPLY
(
SELECT NewValue = N.v.value(N''.'', ''nvarchar(max)'')
FROM SpliteCol.nodes(N''/root/v'') N(v)
) b'
SET @SQL = REPLACE(@SQL, N'@TableName', @TableName)
SET @SQL = REPLACE(@SQL, N'@KeyColName', @KeyColName)
SET @SQL = REPLACE(@SQL, N'@SpliteColName', @SpliteColName)
SET @SQL = REPLACE(@SQL, N'@Quote', @Quote)
IF NOT @Where IS NULL
SET @SQL = REPLACE(@SQL, N'@Where', @Where)
EXEC sp_executesql @Sql
END
示例:
SET NOCOUNT ON
CREATE TABLE ##Table([keyCol] varchar(3), [NewValues] varchar(max))
--原数据
SELECT
[title_id]
,[title]
FROM [pubs].[dbo].[titles]
WHERE [type] LIKE 'p%'
--以title_id的前两个字符为参考键值,合并title到一个临时表中
INSERT INTO ##Table
EXECUTE [ChineseHoliday].[Helper].[JoinValue]
@TableName = '[pubs].[dbo].[titles]'
,@KeyColName = 'LEFT([title_id], 2)'
,@JoinColName = '''《''+[title] + ''》'''
,@Quote = ','
,@Where = '[type] LIKE ''p%'''
--显示
SELECT * FROM ##Table
--对临时表NewValues的值进行分拆
EXECUTE [ChineseHoliday].[Helper].[SpliteValues]
@TableName = '##Table'
,@KeyColName = '[keyCol]'
,@SpliteColName = '[NewValues]'
,@Quote = ','
--删除临时表
DROP TABLE ##Table
结果:
title_id title
-------- --------------------------------------------------------------------------------
PC1035 But Is It User Friendly?
PC8888 Secrets of Silicon Valley
PC9999 Net Etiquette
PS1372 Computer Phobic AND Non-Phobic Individuals: Behavior Variations
PS2091 Is Anger the Enemy?
PS2106 Life Without Fear
PS3333 Prolonged Data Deprivation: Four Case Studies
PS7777 Emotional Security: A New Algorithm
keyCol NewValues
------ ------------------------------------------
PC 《But Is It User Friendly?》,《Secrets of Silicon Valley》,《Net Etiquette》
PS 《Computer Phobic AND Non-Phobic Individuals: Behavior Variations》,《Is Anger the Enemy?》,《Life Without Fear》,《Prolonged Data Deprivation: Four Case Studies》,《Emotional Security: A New Algorithm》
KeyCol NewValue
------ ------------------------------------------
PC 《But Is It User Friendly?》
PC 《Secrets of Silicon Valley》
PC 《Net Etiquette》
PS 《Computer Phobic AND Non-Phobic Individuals: Behavior Variations》
PS 《Is Anger the Enemy?》
PS 《Life Without Fear》
PS 《Prolonged Data Deprivation: Four Case Studies》
PS 《Emotional Security: A New Algorithm》
继续:字符串的分拆
-- =============================================
-- Author: LzmTW
-- Create date: 20080108
-- Description: 拆分字符串
-- =============================================
CREATE FUNCTION [Func].[Splite]
(
@Input nvarchar(max)
,@Quote nvarchar(max)
)
RETURNS
@Table TABLE
(
[ID] int identity(1,1) PRIMARY KEY
,[Value] nvarchar(max)
)
AS
BEGIN
INSERT @Table
SELECT
[Value] = NewValue
FROM
(
SELECT
SpliteCol = CONVERT(
xml
,N'' + REPLACE(
@Input
,@Quote
,N'') + N'')
) a
OUTER APPLY
(
SELECT NewValue = N.v.value(N'.', 'nvarchar(max)')
FROM SpliteCol.nodes(N'/root/v') N(v)
) b
RETURN
END
示例:
定义新行,
CREATE FUNCTION [Const].[NewLine]
(
)
RETURNS nchar(2)
AS
BEGIN
DECLARE @Result nchar(2)
SELECT @Result = char(13) + char(10)
RETURN @Result
END
DECLARE
@Input nvarchar(max)
,@Quote nvarchar(max)
SET @Input = N'90
10
20
30
40
50
60'
SET @Quote = [Const].NewLine()
SELECT * FROM [Func].[Splite] (@Input, @Quote)
结果
ID Value
----------- ------
1 90
2 10
3 20
4 30
5 40
6 50
7 60
(7 行受影响)


猜你喜欢
- 用了两种方式解决该问题,都是网上现有的解决方案。场景说明:有一个数据文件,以文本方式保存,现在有三列user_id,plan_id,mobi
- 前言copy()与deepcopy()之间的区分必须要涉及到python对于数据的存储方式。深复制被复制对象完全再复制一遍作为独立的新个体单
- 内容摘要:现在InterNet 越来越成为生活中不可或缺的一部分,制作网页的动态语言也越来越多,主要流行的有以下几种,ASP,PH
- 本系列文章一直所没有触及的就是有关”还原(Restore)”的话题,因为一旦牵扯到这个话题就会涉及大量的误区,多到我无法通过一篇文章说完的地
- 这篇文章主要介绍了Python Lambda函数使用总结详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- python中的数字类型工具python中为更高级的工作提供很多高级数字编程支持和对象,其中数字类型的完整工具包括:1.整数与浮点型,2.复
- 由于下学期报了一个Python的入门课程所以寒假一直在自己摸索,毕竟到时候不能挂科,也是水水学分最近心血来潮打算试试爬一下百度翻译肝了一天终
- 1.BeautifulSoup简介BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解
- 这篇文章主要介绍了简单了解django三种文件下载方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 昨天Steve的 讲座涉及了一个我从没考虑的领域,在没法优化后台服务器的时候,如何合理的放置网页的元件让她们在浏览器里显示得更加快。这里,我
- 版本选择因为MySql的版本越来越多,而作为中小网站者可能没有足够的经济去购买商业版本,所以一般选择免费版,而且功能也是足够使用的。有钱任性
- 前言centos 是自带python的。但是版本稍微旧一些。搞python开发,肯定要用新一点的稳定版。所以,要升级一下python。本文将
- 本文实例讲述了PHP实现无限极分类的两种方式。分享给大家供大家参考,具体如下:面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表
- Firefox 2.0 在对 XML 的支持方面有几个重要的改进。目前它的用户部署如日中天。了解 Firefox 2.0 XML 特性的改进
- 起源就在今年9月份,我负责的部门平台项目发布了一个新版本,该版本同时上线了一个新功能,简单说有点类似定时任务。头一天一切正常,但第二天出现了
- set()函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。set 语法:class set([it
- 本文实例讲述了python自动化测试的过程,分享给大家供大家参考。具体代码如下:import unittest ##############
- OS ( Operating System 操作系统 ) 操作系统模块;它是属于python的标准库,也就是Python自带的库;它常用于处
- 如下所示:#提取目录下所有图片,更改尺寸后保存到另一目录from PIL import Imageimport os.pathimport
- 使用索引获取列表的元素(随机读取)列表元素支持用索引访问,正向索引从0开始colors=["red","blu