|
讲解SQL Server2005数据项的分拆与合并
( 2008/6/26 13:26 )
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'@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)
EXEC sp_executesql @SQL END
-- 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 示例:
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
EXECUTE [ChineseHoliday].[Helper].[SpliteValues] @TableName = '##Table' ,@KeyColName = '[keyCol]' ,@SpliteColName = '[NewValues]' ,@Quote = ',' --删除临时表 DROP TABLE ##Table 结果:
-------- -------------------------------------------------------------------------------- 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
------ ------------------------------------------ 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》
------ ------------------------------------------ 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
END 示例:
( ) RETURNS nchar(2) AS BEGIN
END
DECLARE @Input nvarchar(max) ,@Quote nvarchar(max)
10 20 30 40 50 60'
结果
----------- ------ 1 90 2 10 3 20 4 30 5 40 6 50 7 60
|
·Epictetus数据库管理工具推出0.3.2 Beta版 (10-7) ·技巧实例:如何在.NET中访问MySQL数据库 (9-25) ·有关PB/Sybase开发过程中数据库转移介绍 (9-25) ·SQL Server 2008数据库中如何使用表值参数 (9-25) ·甲骨文推“数据库机器” 首涉电脑硬件销售 (9-25) 热议文章·东莞数字电视维护费300元/年 (9-22) 评:对东莞数字电视的不满1、影象质量太差、速度太慢,经常有卡机、不流畅现象。2、什么... ·高端的口号低端的招标 电信招标有类联通 (9-21) ·重组后的中国联通,何以对抗即将到来的混战 (9-17) ·国资委专家细述电信失衡两诱因 (8-27) ·设备商围攻激进华为:它将摧毁TD (8-20) ·中国电信获得800MHz频率几成定局 (8-19) ·参数底下的真相 看看交换机的内在区别 (10-7) ·雅虎电子邮件客户端漏洞 泄露用户密码 (10-7) ·网络蔓延利用PDF缺陷发起攻击的黑客工具 (10-7) ·Adobe软件安全漏洞让用户免费观看视频 (10-7) ·黄金周服务业网络管理解决方案全攻略 (10-7) |
|||||||||||||||
|