我的建议是首先规范你的input
表。在SQL Server中,您可以使用递归CTE将逗号分隔列表中的数据拆分为多行。
的CTE将类似于以下内容:
;with cte (id, col, Name_list, value, text_list) as
(
select id,
cast(left(Name, charindex(',',Name+',')-1) as varchar(50)) col,
stuff(Name, 1, charindex(',',Name+','), '') Name_list,
cast(left(text, charindex(',',text+',')-1) as varchar(50)) value,
stuff(text, 1, charindex(',',text+','), '') text_list
from input
union all
select id,
cast(left(Name_list, charindex(',',Name_list+',')-1) as varchar(50)) col,
stuff(Name_list, 1, charindex(',',Name_list+','), '') Name_list,
cast(left(text_list, charindex(',',text_list+',')-1) as varchar(50)) value,
stuff(text_list, 1, charindex(',',text_list+','), '') text_list
from cte
where Name_list > ''
or text_list > ''
)
select id, col, value
from cte;
见SQL Fiddle with Demo。这将让你在格式的数据:
| ID | COL | VALUE |
-------------------------------
| 1 | Name | John |
| 2 | FirstName | Ray |
| 3 | Name | Mary |
| 4 | FirstName | Cary |
| 5 | PersonID | 1234 |
一旦数据在格式,然后你可以枢根据您在每个表所需的列中的数据。
例如,如果你想为Table1
数据,您将使用:
;with cte (id, col, Name_list, value, text_list) as
(
select id,
cast(left(Name, charindex(',',Name+',')-1) as varchar(50)) col,
stuff(Name, 1, charindex(',',Name+','), '') Name_list,
cast(left(text, charindex(',',text+',')-1) as varchar(50)) value,
stuff(text, 1, charindex(',',text+','), '') text_list
from input
union all
select id,
cast(left(Name_list, charindex(',',Name_list+',')-1) as varchar(50)) col,
stuff(Name_list, 1, charindex(',',Name_list+','), '') Name_list,
cast(left(text_list, charindex(',',text_list+',')-1) as varchar(50)) value,
stuff(text_list, 1, charindex(',',text_list+','), '') text_list
from cte
where Name_list > ''
or text_list > ''
)
select *
-- into table1
from
(
select id, col, value
from cte
where col in ('Name', 'DOB')
) d
pivot
(
max(value)
for col in (Name, DOB)
) piv;
见SQL Fiddle with Demo
你会再与下一个表中的值替换每个查询的列名。
只需用手对每个查询类型进行硬编码;没有对此的自动化支持,但它比困难更繁琐。 – 2013-04-09 22:18:35