欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【讲解SQL Server2005数据项的分拆与合并】,下面是详细的分享!
讲解SQL Server2005数据项的分拆与合并
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 行受影响)
以上所分享的是关于讲解SQL Server2005数据项的分拆与合并,下面是编辑为你推荐的有价值的用户互动:
相关问题:sqlserver2005,sql语句循环查询,合并结果集
答:你可以使用n1 in (4072,4073,.....)或者将数据放在某个表里,用 n1 in (select xx from...),这样语句就大大简化了,每个字段需要一个查询。 如果字段太多,那么去看看MSSQL的全文检索吧。 >>详细
相关问题:SQL server 2005 多条SQL语句合并为一条
答:由于不知道语句1还是语句2返回姓名的全集,所以只能假定语句1与语句2互相不包含,此时只能使用全连接才行 select coalesce(t1.a,t2.a) a, coalesce(t1.b,0) b, coalesce(t2.c,0) cfrom t1 full join t2 on t1.a=t2.a >>详细
相关问题:sql server 字段合并和拆分,急急!!!!
答:create table t1 (id int,t2ids varchar(10)) create table t2 (id int,name varchar(10)) insert into t1 select 1,'1;2' union all select 2,'1;3' insert into t2 select 1 ,'李' union all select 2,'王' union all select 3,'张' go create... >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
