Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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表中的XML字符串中提取多个值_Sql_Sql Server_Ssms - Fatal编程技术网

从存储在SQL表中的XML字符串中提取多个值

从存储在SQL表中的XML字符串中提取多个值,sql,sql-server,ssms,Sql,Sql Server,Ssms,尝试从值为XML的列中提取数据,如下所示,该列列出了报告在一周内运行的时间: WeeklyRecurrence <WeeksInterval>1</WeeksInterval><DaysOfWeek><Sunday>false</Sunday><Monday>true</Monday><Tuesday>false</Tuesday><Wednesday>true</Wed

尝试从值为XML的列中提取数据,如下所示,该列列出了报告在一周内运行的时间:

WeeklyRecurrence <WeeksInterval>1</WeeksInterval><DaysOfWeek><Sunday>false</Sunday><Monday>true</Monday><Tuesday>false</Tuesday><Wednesday>true</Wednesday><Thursday>false</Thursday><Friday>true</Friday><Saturday>false</Saturday></DaysOfWeek></WeeklyRecurrence>
我尝试过使用Substring和Charindex,但这只能得到第一行


提前感谢。

这里有一个使用
节点()的快速示例。

我不确定你是否想要真正的价值观

Declare @XML xml = '<WeeklyRecurrence><WeeksInterval>1</WeeksInterval><DaysOfWeek><Sunday>false</Sunday><Monday>true</Monday><Tuesday>false</Tuesday><Wednesday>true</Wednesday><Thursday>false</Thursday><Friday>true</Friday><Saturday>false</Saturday></DaysOfWeek></WeeklyRecurrence>'

Select Item  = xAttr.value('local-name(.)', 'nvarchar(100)')
      ,Value = xAttr.value('.','varchar(100)')
From  @XML.nodes('//WeeklyRecurrence/DaysOfWeek/*') xNode(xAttr)

下面是使用
Nodes()

我不确定你是否想要真正的价值观

Declare @XML xml = '<WeeklyRecurrence><WeeksInterval>1</WeeksInterval><DaysOfWeek><Sunday>false</Sunday><Monday>true</Monday><Tuesday>false</Tuesday><Wednesday>true</Wednesday><Thursday>false</Thursday><Friday>true</Friday><Saturday>false</Saturday></DaysOfWeek></WeeklyRecurrence>'

Select Item  = xAttr.value('local-name(.)', 'nvarchar(100)')
      ,Value = xAttr.value('.','varchar(100)')
From  @XML.nodes('//WeeklyRecurrence/DaysOfWeek/*') xNode(xAttr)
如果表格有多行,则需要提取另一个值(
WeeksInterval
@t.ID
?),以便在本例中进一步区分结果


如果表中有多行,则需要提取另一个值(
WeeksInterval
@t.ID
?),以便在这种情况下进一步区分结果。

您看过XQUERY吗?我假设您的数据是有效的xml,并且位于
xml
数据类型中;虽然当前是无效的XML,因为它以一个
WeeklyRecurrence
标记结束,但是,它在开始时不是一个标记。公平地说,如果您的数据在表中,Jeroen Mostert answer是更好的解决方案,因为他使用了交叉应用程序。您看过XQUERY了吗?我假设您的数据是有效的xml,并且位于
xml
数据类型中;虽然当前是无效的XML,因为它以一个
WeeklyRecurrence
标记结束,但是,它在开始时不是标记。公平地说,如果数据在表中,Jeroen Mostert answer是更好的解决方案,因为他使用交叉APPLYPlus 1查看“表”。。。我错过了那加上1因为我看到了“桌子”。。。我错过了谢谢约翰,这工作很棒。我不熟悉Nodes()。我来读一下。谢谢约翰,这部作品很棒。我不熟悉Nodes()。我来读一下。
Item        Value
Sunday      false
Monday      true
Tuesday     false
Wednesday   true
Thursday    false
Friday      true
Saturday    false
DECLARE @t TABLE(schedule XML);
INSERT @t(schedule) VALUES (N'<WeeklyRecurrence><WeeksInterval>1</WeeksInterval><DaysOfWeek><Sunday>false</Sunday><Monday>true</Monday><Tuesday>false</Tuesday><Wednesday>true</Wednesday><Thursday>false</Thursday><Friday>true</Friday><Saturday>false</Saturday></DaysOfWeek></WeeklyRecurrence>');

SELECT 
    [day] = x.value('local-name(.)', 'nvarchar(max)'),
    [present] = x.value('.', 'nvarchar(max)')
FROM @t 
CROSS APPLY schedule.nodes('/WeeklyRecurrence/DaysOfWeek/*') w(x)
+-----------+---------+
|    day    | present |
+-----------+---------+
| Sunday    | false   |
| Monday    | true    |
| Tuesday   | false   |
| Wednesday | true    |
| Thursday  | false   |
| Friday    | true    |
| Saturday  | false   |
+-----------+---------+