协助 XML 个标签
Assistance with XML tags
我正在处理 SQL 查询 (MS SQL),它将输出为 XML。我需要一些具有相同标签名称 <CustomInteger>
的标签的帮助。我的输出应该是这样的:
<CustomIntegers>
<CustomInteger>
<FieldID>2701</FieldID>
<Value>15</Value>
</CustomInteger>
<CustomInteger>
<FieldID>2704</FieldID>
<Value>28</Value>
</CustomInteger>
<CustomInteger>
<FieldID>2705</FieldID>
<Value>28</Value>
</CustomInteger>
</CustomIntegers>
但我目前得到的是:
<CustomIntegers>
<CustomInteger>
<FieldID>2701</FieldID>
<Value>15</Value>
<FieldID>2704</FieldID>
<Value>28</Value>
<FieldID>2705</FieldID>
<Value>28</Value>
</CustomInteger>
</CustomIntegers>
我需要 <FieldID>
和 <Value>
标签在其自己的 <CustomInteger>
标签中。
--正在创建table
CREATE TABLE [dbo].[Student](
[TermCode] [varchar](5),
[StudentID] [varchar](9),
[RegisteredHours] [decimal](7, 4) NULL,
[CreditsAttempted] [decimal](7, 4) NULL,
[CreditsEarned] [decimal](7, 4) NULL
) ON [PRIMARY]
GO
--插入记录
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '123456789', '9.0000', '6.0000', '6.0000')
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '234567890', '15.0000', '28.0000', '28.0000')
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '345678901', '12.0000', '30.0000', '27.0000')
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '456789012', '10.0000', '30.0000', '30.0000')
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '567890123', '12.0000', '32.0000', '29.0000')
--我目前的代码:
select
'2701' as [CustomInteger/FieldID],
cast(RegisteredHours as int) AS [CustomInteger/Value],
'2704' as [CustomInteger/FieldID],
cast(CreditsAttempted as int) AS [CustomInteger/Value],
'2705' as [CustomInteger/FieldID],
cast(CreditsEarned as int) AS [CustomInteger/Value]
from Student
for xml path('CustomIntegers'), type, elements
如有任何帮助,我们将不胜感激!
请尝试以下解决方案。
您的输出 XML 似乎应该由一行中的数据组成。
SQL#1
-- DDL and sample data population, start
DECLARE @student TABLE (
[TermCode] [varchar](5),
[StudentID] [varchar](9),
[RegisteredHours] [decimal](7, 4) NULL,
[CreditsAttempted] [decimal](7, 4) NULL,
[CreditsEarned] [decimal](7, 4) NULL
);
INSERT INTO @student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned) VALUES
('20211', '123456789', '9.0000', '6.0000', '6.0000'),
('20211', '234567890', '15.0000', '28.0000', '28.0000'),
('20211', '345678901', '12.0000', '30.0000', '27.0000'),
('20211', '456789012', '10.0000', '30.0000', '30.0000'),
('20211', '567890123', '12.0000', '32.0000', '29.0000');
-- DDL and sample data population, end
SELECT (
SELECT TRY_CAST(RegisteredHours AS INT) AS RegisteredHours
, TRY_CAST(CreditsAttempted AS INT) AS CreditsAttempted
, TRY_CAST(CreditsEarned AS INT) AS CreditsEarned
FROM @student
WHERE StudentID = '234567890'
FOR XML PATH('r'), TYPE, ROOT('root')
).query('<CustomIntegers>
{
for $x in /root/r/*
return <CustomInteger>
<FieldID>
{
if (local-name($x)="RegisteredHours") then "2701"
else if (local-name($x)="CreditsAttempted") then "2704"
else if (local-name($x)="CreditsEarned") then "2705"
else ()
}
</FieldID>
<Value>{data($x)}</Value>
</CustomInteger>
}
</CustomIntegers>');
SQL#2
SELECT '2701' as [CustomInteger/FieldID]
, TRY_CAST(RegisteredHours as int) AS [CustomInteger/Value], NULL
, '2704' as [CustomInteger/FieldID]
, TRY_CAST(CreditsAttempted as int) AS [CustomInteger/Value], NULL
, '2705' as [CustomInteger/FieldID]
, TRY_CAST(CreditsEarned as int) AS [CustomInteger/Value]
FROM @Student
--WHERE StudentID = '234567890'
FOR XML PATH('CustomIntegers'), TYPE, ROOT('root');
输出
<CustomIntegers>
<CustomInteger>
<FieldID>2701</FieldID>
<Value>15</Value>
</CustomInteger>
<CustomInteger>
<FieldID>2704</FieldID>
<Value>28</Value>
</CustomInteger>
<CustomInteger>
<FieldID>2705</FieldID>
<Value>28</Value>
</CustomInteger>
</CustomIntegers>
您可以在相关子查询(每行)内对值进行逆透视并将它们转换为 XML
SELECT
(
SELECT FieldID, Value
FROM (VALUES
('2701',cast(RegisteredHours as int)),
('2704',cast(CreditsAttempted as int)),
('2705',cast(CreditsEarned as int))
) v(FieldID, Value)
FOR XML PATH('CustomInteger'), TYPE
) AS CustomIntegers
FROM Student
FOR XML PATH(''), TYPE;
我正在处理 SQL 查询 (MS SQL),它将输出为 XML。我需要一些具有相同标签名称 <CustomInteger>
的标签的帮助。我的输出应该是这样的:
<CustomIntegers>
<CustomInteger>
<FieldID>2701</FieldID>
<Value>15</Value>
</CustomInteger>
<CustomInteger>
<FieldID>2704</FieldID>
<Value>28</Value>
</CustomInteger>
<CustomInteger>
<FieldID>2705</FieldID>
<Value>28</Value>
</CustomInteger>
</CustomIntegers>
但我目前得到的是:
<CustomIntegers>
<CustomInteger>
<FieldID>2701</FieldID>
<Value>15</Value>
<FieldID>2704</FieldID>
<Value>28</Value>
<FieldID>2705</FieldID>
<Value>28</Value>
</CustomInteger>
</CustomIntegers>
我需要 <FieldID>
和 <Value>
标签在其自己的 <CustomInteger>
标签中。
--正在创建table
CREATE TABLE [dbo].[Student](
[TermCode] [varchar](5),
[StudentID] [varchar](9),
[RegisteredHours] [decimal](7, 4) NULL,
[CreditsAttempted] [decimal](7, 4) NULL,
[CreditsEarned] [decimal](7, 4) NULL
) ON [PRIMARY]
GO
--插入记录
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '123456789', '9.0000', '6.0000', '6.0000')
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '234567890', '15.0000', '28.0000', '28.0000')
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '345678901', '12.0000', '30.0000', '27.0000')
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '456789012', '10.0000', '30.0000', '30.0000')
Insert into Student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned)
values ('20211', '567890123', '12.0000', '32.0000', '29.0000')
--我目前的代码:
select
'2701' as [CustomInteger/FieldID],
cast(RegisteredHours as int) AS [CustomInteger/Value],
'2704' as [CustomInteger/FieldID],
cast(CreditsAttempted as int) AS [CustomInteger/Value],
'2705' as [CustomInteger/FieldID],
cast(CreditsEarned as int) AS [CustomInteger/Value]
from Student
for xml path('CustomIntegers'), type, elements
如有任何帮助,我们将不胜感激!
请尝试以下解决方案。
您的输出 XML 似乎应该由一行中的数据组成。
SQL#1
-- DDL and sample data population, start
DECLARE @student TABLE (
[TermCode] [varchar](5),
[StudentID] [varchar](9),
[RegisteredHours] [decimal](7, 4) NULL,
[CreditsAttempted] [decimal](7, 4) NULL,
[CreditsEarned] [decimal](7, 4) NULL
);
INSERT INTO @student (TermCode, StudentID, RegisteredHours, CreditsAttempted, CreditsEarned) VALUES
('20211', '123456789', '9.0000', '6.0000', '6.0000'),
('20211', '234567890', '15.0000', '28.0000', '28.0000'),
('20211', '345678901', '12.0000', '30.0000', '27.0000'),
('20211', '456789012', '10.0000', '30.0000', '30.0000'),
('20211', '567890123', '12.0000', '32.0000', '29.0000');
-- DDL and sample data population, end
SELECT (
SELECT TRY_CAST(RegisteredHours AS INT) AS RegisteredHours
, TRY_CAST(CreditsAttempted AS INT) AS CreditsAttempted
, TRY_CAST(CreditsEarned AS INT) AS CreditsEarned
FROM @student
WHERE StudentID = '234567890'
FOR XML PATH('r'), TYPE, ROOT('root')
).query('<CustomIntegers>
{
for $x in /root/r/*
return <CustomInteger>
<FieldID>
{
if (local-name($x)="RegisteredHours") then "2701"
else if (local-name($x)="CreditsAttempted") then "2704"
else if (local-name($x)="CreditsEarned") then "2705"
else ()
}
</FieldID>
<Value>{data($x)}</Value>
</CustomInteger>
}
</CustomIntegers>');
SQL#2
SELECT '2701' as [CustomInteger/FieldID]
, TRY_CAST(RegisteredHours as int) AS [CustomInteger/Value], NULL
, '2704' as [CustomInteger/FieldID]
, TRY_CAST(CreditsAttempted as int) AS [CustomInteger/Value], NULL
, '2705' as [CustomInteger/FieldID]
, TRY_CAST(CreditsEarned as int) AS [CustomInteger/Value]
FROM @Student
--WHERE StudentID = '234567890'
FOR XML PATH('CustomIntegers'), TYPE, ROOT('root');
输出
<CustomIntegers>
<CustomInteger>
<FieldID>2701</FieldID>
<Value>15</Value>
</CustomInteger>
<CustomInteger>
<FieldID>2704</FieldID>
<Value>28</Value>
</CustomInteger>
<CustomInteger>
<FieldID>2705</FieldID>
<Value>28</Value>
</CustomInteger>
</CustomIntegers>
您可以在相关子查询(每行)内对值进行逆透视并将它们转换为 XML
SELECT
(
SELECT FieldID, Value
FROM (VALUES
('2701',cast(RegisteredHours as int)),
('2704',cast(CreditsAttempted as int)),
('2705',cast(CreditsEarned as int))
) v(FieldID, Value)
FOR XML PATH('CustomInteger'), TYPE
) AS CustomIntegers
FROM Student
FOR XML PATH(''), TYPE;