【发布时间】:2014-12-13 03:00:42
【问题描述】:
我从 xml 生成了一个临时表,它具有以下结构
column1 column2
id 1234
code ukjk
.
.
there will be another 60 rows again
id 4586
code ouiu
.
.
there will be another 60 rows again
id 78545
code khdsjf
like this there will be 15 id's in the table
现在我想将行转换为列
我不想要全部 60 个,我只需要 5 个
id code vdb_id guid ....
1234
4586
78545
我还附上了 XML 文件图像..
我用过枢轴功能
IF OBJECT_ID('tempdb..#xml_final') IS NOT NULL DROP TABLE #xml_final
CREATE TABLE #xml_final (rownum int, Project_id int, Project_Name varchar(60), Project_manager_id int, Updated_date varchar(60) )
insert into #xml_final
SELECT * FROM
(
SELECT xmlData.Result.value('v[1]','VARCHAR(200)') AS A,
xmlData.Result.value('n[1]','VARCHAR(200)') AS B,
ROW_NUMBER() over(PARTITION BY xmlData.Result.value('n[1]','VARCHAR(200)')
order by xmlData.Result.value('v[1]','VARCHAR(200)')) AS Num
FROM @xmlData.nodes('//result/rows/row/f') xmlData(Result)
) AS A
Pivot (Min(A) FOR B IN ([id] ,
[summary],
[manager_id],
[ts]
)
) piv
但它不能正常工作..我收到不匹配错误
例如
id 1234 i am getting code as ouiu
output2 表将有 3 列
row_num key2 item_value
1 id 1234
5 proj_id 7655
9 task_name kfhkjfdhg
21 id 5455
25 proj_id 6789797
29 task_name dsyhuiyfhdi
而 key2 将只包含这 3 个列名
我想要的输出是,
id proj_id task_name
1234 7655 kfhkjfdhg
5455 6789797 dsyhuiyfhdi
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(key2)
from #output_2
group by key2, row_num
order by row_num
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' from
(
select item_value, key2
from #output_2
) x
pivot
(
max(item_value)
for key2 in (' + @cols + N')
) p '
print @query
exec sp_executesql @query;
更新查询
DECLARE @columns VARCHAR(max)='',
@sql NVARCHAR(max)
SELECT @columns += COL
FROM (SELECT DISTINCT '[' + Isnull(key2, '') + '],' col
FROM #output_2
WHERE item_value IS NOT NULL) a
SELECT @columns = LEFT(@columns, Len(@columns) - 1)
SET @sql ='SELECT rownum,' + @columns + '
FROM (SELECT Row_number()OVER(PARTITION BY key2 ORDER BY item_value) rownum,
*
FROM #output_2)a
PIVOT(Max(item_value)
FOR key2 IN(' + @columns + ')) piv '
Print @sql
EXEC Sp_executesql @sql
更新查询 2:
IF OBJECT_ID('tempdb..#output_3') IS NOT NULL DROP TABLE #output_3
CREATE TABLE #output_3 ( row_id int, row_num int , task_id int, project_id int, task_name varchar(200) )
insert into #output_3
SELECT Row_number() over (ORDER BY (select null)) row_id , rownum,(id),(project_id),(summary)
FROM (SELECT Row_number()OVER(PARTITION BY key2 ORDER BY (select null)) rownum,
*
FROM #output_2)a
PIVOT(Max(item_value)
FOR key2 IN([id],[project_id],[summary])) piv
select row_id, task_id, task_name, project_id from #output_3
输出:
插入查询
IF OBJECT_ID('tempdb..#output') IS NOT NULL DROP TABLE #output
CREATE TABLE #output ( id int ,key2 varchar(50), item_value varchar(200) )
insert into #output
select
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as SNumber,
key2 = Item2.value('(n)[1]','varchar(50)'),
ItemValue = Item2.value('(v)[1]','varchar(50)')
from
@xmlData.nodes('/result/rows') as T(Item)
cross apply
item.nodes('row/f') as T2(Item2)
如何解决这个问题..
【问题讨论】:
-
您的预期输出不清楚!
-
@NoDisplayName : 我添加了一张图片,预期的输出应该是什么样子
-
@NoDisplayName : 我添加了一个链接,从那里我只为 xml 输入构建了 tsql 查询..
-
虽然最初保存到临时表中,但我们不能根据需要保存详细信息。我的意思是,您可以直接存储到所需的架构中,而不是存储到列中
-
@irvgk 是的,我们可以做......但我是新手......你能帮我吗,如何继续......
标签: sql sql-server xml sql-server-2008 xml-parsing