Sql server 在SQL Server 2014中使用XML EXPLICIT构建XML输出
我几乎完成了我需要的,但我错过了最后一件事。我有两个表被连接以创建XML输出。我需要在同一个SELECT语句中使用这两个表的元素,但我很难做到这一点。这是我的代码:Sql server 在SQL Server 2014中使用XML EXPLICIT构建XML输出,sql-server,sql-server-2014,Sql Server,Sql Server 2014,我几乎完成了我需要的,但我错过了最后一件事。我有两个表被连接以创建XML输出。我需要在同一个SELECT语句中使用这两个表的元素,但我很难做到这一点。这是我的代码: SELECT 1 as Tag, 0 as Parent, RTRIM(dbo.DataItemInfo.DataItem) as [DataItem!1!name] --RTRIM(dbo.DataItemInfo.DataItem) as [dbo.DataSchedule.DataItemVa
SELECT
1 as Tag,
0 as Parent,
RTRIM(dbo.DataItemInfo.DataItem) as [DataItem!1!name]
--RTRIM(dbo.DataItemInfo.DataItem) as [dbo.DataSchedule.DataItemValue!1!]
FROM
dbo.DataItemInfo
INNER JOIN
dbo.DataSchedule
ON dbo.DataSchedule.SignID = dbo.DataItemInfo.SignID
AND dbo.DataSchedule.SignID=@ParamSignID
AND dbo.DataSchedule.ScheduleID = dbo.DataItemInfo.ScheduleID
FOR XML EXPLICIT, ROOT('DataItems')
注释掉的部分是我尝试过的事情之一。此时,它会产生以下输出:
<DataItems>
<DataItem name="Test1" />
<DataItem name="Test2" />
<DataItem name="Test3" />
<DataItem name="Test4" />
<DataItem name="Test5" />
</DataItems>
但我想:
<DataItems>
<DataItem name="Test1">ValFromScheduleTableHere<DataItem/>
<DataItem name="Test2">ValFromScheduleTableHere<DataItem/>
<DataItem name="Test3">ValFromScheduleTableHere<DataItem/>
<DataItem name="Test4">ValFromScheduleTableHere<DataItem/>
<DataItem name="Test5">ValFromScheduleTableHere<DataItem/>
</DataItems>
ValFromScheduleTableHere
ValFromScheduleTableHere
ValFromScheduleTableHere
ValFromScheduleTableHere
ValFromScheduleTableHere
我知道如何从原始表填充“ValFromScheduleTableHere”,但不知道如何从第二个表填充。谢谢您的帮助。
for XML PATH
语法更简单,您可以使用此SQL获得所需的结果
SELECT
(
SELECT
RTRIM(dbo.DataItemInfo.DataItem) as 'DataItem/@name'
DataSchedule.DataitemValue as 'DataItem'
FROM
dbo.DataItemInfo
INNER JOIN
dbo.DataSchedule
ON dbo.DataSchedule.SignID = dbo.DataItemInfo.SignID
AND dbo.DataSchedule.SignID=@ParamSignID
AND dbo.DataSchedule.ScheduleID = dbo.DataItemInfo.ScheduleID
FOR XML PATH(''), TYPE
)
FOR XML PATH(''), ROOT('DataItems')
我意识到这已经得到了回答,甚至不再使用
显式模式,但我碰巧弄明白了,所以我想我会与大家分享。不管是好是坏,你都很接近。作为实体值的字段的列名缺少“directive”部分,这是funky列名的第四个(可选)部分代码>-约定。你需要!xml
作为最后一部分,当然也调整了RTRIM和别名其余部分中的内容,看起来像:
RTRIM(DataSchedule.DataItemValue) as [DataItem!1!!xml]
任何人都可以用以下方法测试理论(我对齐了列别名,以便更容易地看到第三个别名中的差异):
选择1作为[标记],
0作为[父项],
RTRIM(so.[type])作为[Object!1!type],
so.create_date为[Object!1!CreateDate],
所以,[name]作为[Object!1!!xml]
从sys.so
对于XML显式,根('Objects');
输出:
sysrscols
系统行集
系统克隆
系统异位
系统文件1
...
有关更多信息,请参见以下MSDN页面:为什么不使用作为XML路径
?与XML EXPLICIT的相比,理解和获得所需的结果通常要容易得多,
…也许这会更容易,但一旦我完成了这件小事,我就完成了。我在sql server工作了将近9年,我只见过一次使用EXPLICIT
的XML查询,但没有任何意义,据我记忆所及,我必须对XML路径(“”)使用,在内部选择中键入
,以获得相同的结果。这就是如何完成的,谢谢!我想我再也不会使用XML显式了。真让人头痛。