SQL Server2008中CROSS APPLY的应用范例(二) - 将一个或多个字段内用逗号分隔的内容分成多条记录

来源:互联网 发布:沙特投资歼31知乎 编辑:程序博客网 时间:2024/06/05 16:21

SQL Server2008中CROSS APPLY的应用范例(二)

                       ——将一个或多个字段内用逗号分隔的内容分成多条记录


本文已经有最新版本:SQL Server2008中CROSS APPLY的应用范例(三) - 将一个或多个字段内用逗号分隔的内容分成多条记录

DECLARE @DutyLst VARCHAR(MAX);DECLARE @DutyNames NVARCHAR(MAX);SET @DutyLst = '793f2b96-0818-491f-839a-3bf431da6879/14a95c8e-e710-49fa-8b2e-579c9ae46984,793f2b96-0818-491f-839a-3bf431da6879/ed5a4bbe-54db-41f7-81fc-97831e00c8ac';SET @DutyNames = N'集团/上海/总经理,集团/上海/部门经理';SELECT N.v.value('.' , 'varchar(100)') AS DutySN, M.v.value('.' , 'varchar(100)') AS DutyName  FROM (SELECT [idLst] = CONVERT(XML , '<v>' + REPLACE(@DutyLst , ',' , '</v><v>') + '</v>'),[nameLst] = CONVERT(XML , '<v>' + REPLACE(@DutyNames , ',' , '</v><v>') + '</v>')) A CROSS APPLY A.[idLst].nodes('/v') N( v ) CROSS APPLY A.[nameLst].nodes('/v') M( v )

查询结果

                                                       DutySN                                                                                                 DutyName

---------------------------------------------------------------------------------------------------------------------------------------------------------

793f2b96-0818-491f-839a-3bf431da6879/14a95c8e-e710-49fa-8b2e-579c9ae46984集团/上海/总经理
793f2b96-0818-491f-839a-3bf431da6879/14a95c8e-e710-49fa-8b2e-579c9ae46984集团/上海/部门经理
793f2b96-0818-491f-839a-3bf431da6879/ed5a4bbe-54db-41f7-81fc-97831e00c8ac集团/上海/总经理
793f2b96-0818-491f-839a-3bf431da6879/ed5a4bbe-54db-41f7-81fc-97831e00c8ac集团/上海/部门经理


请参考:SQL Server2008中CROSS APPLY的应用范例-将多个不同值更新到不同条件匹配的记录中


如果需要将两个列表解析后写入一条记录的多个字段中,可以采用如下方案:

/*
列表格式:
编号1=数量1,异常数量1;编号2=数量2,异常数量2[,...[,...]]
*/
DECLARE @GoodsCountLst VARCHAR(MAX);SET @GoodsCountLst = '1=22,3;2=132,0';DECLARE @tblActual TABLE(A_ID BIGINT,A_Amount BIGINT,A_Exception BIGINT);INSERT INTO @tblActual(A_ID, A_Amount, A_Exception) SELECT B.ID, B.Amount, B.Exception FROM (SELECT  [value] = CONVERT(XML , '<v>' + REPLACE(@GoodsCountLst , ';' , '</v><v>') + '</v>')) A CROSS APPLY (SELECT ID = SUBSTRING(N.v.value('.' , 'varchar(100)'), 1, charindex( '=', N.v.value('.' , 'varchar(100)')) - 1 ), Amount = SUBSTRING(N.v.value('.' , 'varchar(100)'), charindex( '=', N.v.value('.' , 'varchar(100)')) + 1, charindex( ',', N.v.value('.' , 'varchar(100)')) - charindex( '=', N.v.value('.' , 'varchar(100)')) - 1), Exception = SUBSTRING(N.v.value('.' , 'varchar(100)'), charindex( ',', N.v.value('.' , 'varchar(100)')) + 1, LEN(N.v.value('.' , 'varchar(100)'))) FROM A.[value].nodes('/v') N ( v ) ) B;SELECT * FROM @tblActual;


0 0
原创粉丝点击