Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server 2014中使用XML EXPLICIT构建XML输出_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql server 在SQL Server 2014中使用XML EXPLICIT构建XML输出

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

我几乎完成了我需要的,但我错过了最后一件事。我有两个表被连接以创建XML输出。我需要在同一个SELECT语句中使用这两个表的元素,但我很难做到这一点。这是我的代码:

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显式了。真让人头痛。