【发布时间】:2016-09-29 06:58:15
【问题描述】:
我想遍历 XML Column 并在下面生成报告
表 EmpTransaction 结构
EmployeeId TransactionFieldDetails
458 <PayDetails>...</PayDetails>
459 <PayDetails>...</PayDetails>
下面是 XML 结构
<PayDetails>
<Column Name="NETPAY" DataType="float" Value="45112" />
<Column Name="TDS" DataType="float" Value="150000" />
</PayDetails>
需要的输出
EmployeeId FieldName Value
458 NETPAY 45112
458 TDS 15000
459 NETPAY 45236
459 TDS 17000
我曾尝试使用 tempTable 实现上述报告 需要单个查询才能获得上述报告
我尝试使用以下解决方法来实现
create table #EMPXML (employeeId int, fldname varchar(max),fldval varchar(max))
select ROW_NUMBER()OVER(ORDER BY EmployeeId )AS ID ,EmployeeId,TransactionFieldDetails into #MKISQS_XML from dbo.EmpTrans
DECLARE @TOTINQ INT = (select COUNT(DISTINCT EmployeeId) from #MKISQS_XML)
DECLARE @INQCNT INT = 1
DECLARE @INQCODE VARCHAR(10)
DECLARE @INQXML XML
DECLARE @RELATEDTO VARCHAR(15)
WHILE(@TOTINQ >=@INQCNT)
BEGIN
SET @INQCODE = (SELECT EmployeeId FROM #MKISQS_XML WHERE ID=@INQCNT)
SET @INQXML = (SELECT TransactionFieldDetails FROM #MKISQS_XML WHERE ID=@INQCNT)
INSERT INTO #EMPXML
SELECT @INQCODE,
T.c.value('(@Name)[1]', 'Varchar(max)') AS fldname,
T.c.value('(@Value)[1]', 'Varchar(max)') AS fldval
FROM @INQXML.nodes('//PayDetails/Column') T(c)
SET @INQCNT = @INQCNT+1
END
select * from #EMPXML
需要知道上面的查询可以简化而不是创建临时表
【问题讨论】:
标签: sql sql-server xml sql-server-2008