拆分多列并存储到临时表中

问题描述 投票:0回答:1

我有样本数据:

表:tblsampledata

create table tblsampledata
(
    column1 varchar(50),
    column2 varchar(50)
);

insert into tblsampledata values('Bob Frapples','Gail Forcewind');
insert into tblsampledata values('Paul Molive','Mario Speedwagon');

我有列表映射表与表名:

表:tblmapping

create table tblmapping
(
    tblname varchar(100),
    columnmap varchar(max)
);

insert into tblmapping values('tblsampledata','[column1]|[column2]');   

注意:我想拆分列tblmapping中表名的tblname中存在的列数据,并将其存储到临时表中。

预期结果:#TempTable

column1     column2
---------------------
Bob         Gail
Frapples    Forcewind
Paul        Mario
Molive      Speedwagon
sql-server tsql sql-server-2008-r2
1个回答
3
投票

您需要使用动态查询来实现此目的。

你可以尝试以下。

select @xml = Cast(( '<X>' + Replace(columnmap, '|', '</X><X>') + '</X>' ) AS XML) 
from tblmapping where tblname =@tablename


DECLARE @query AS NVARCHAR(max) = 'select ' +  Stuff((SELECT DISTINCT ', ' + value
            FROM   (
            SELECT n.value('.', 'varchar(100)') AS value 
            FROM   @xml.nodes('X') AS T(n)
        )t
            FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
                  + ' from ' + @tablename; 
exec sp_executesql @query  

Online Demo

要拆分第1列和第2列,您可以使用如下查询。

SELECT CASE 
         WHEN n = 1 THEN LEFT(column1, Charindex(' ', column1) - 1) 
         WHEN n = 2 THEN RIGHT(column1, Charindex(' ', Reverse(column1)) - 1) 
       END AS column1, 
       CASE 
         WHEN n = 1 THEN LEFT(column2, Charindex(' ', column2) - 1) 
         WHEN n = 2 THEN RIGHT(column2, Charindex(' ', Reverse(column2)) - 1) 
       END AS column2 
FROM   tblsampledata t1 
       CROSS JOIN ( VALUES(1),(2) )t(n) 

Full Demo使用动态查询

© www.soinside.com 2019 - 2024. All rights reserved.