我有一个 XML
<response>
<message_infos>
<message_info>
<id>397300589</id>
<pdu_id>673399673</pdu_id>
<status>12</status>
<id>397300589</id>
<pdu_id>673399675</pdu_id>
<status>12</status>
</message_info>
<message_info>
<id>397300591</id>
<pdu_id>673399669</pdu_id>
<status>12</status>
<id>397300591</id>
<pdu_id>673399671</pdu_id>
<status>12</status>
</message_info>
</message_infos>
</response>
我需要另存为
397300589 673399673 12
397300589 673399675 12
397300591 673399669 12
397300591 673399671 12
但是
SELECT *
FROM OPENXML(@ixml, '/response/message_infos/message_info')
WITH (id VARCHAR(50) 'id', pdu_id VARCHAR(50) 'pdu_id', status INT 'status')
给我错误的结果:
397300589 673399673 12
397300591 673399669 12
我做错了什么?我没有找到相同的示例,有人可以帮助我吗?
最佳答案
DECLARE @xml XML = N'
<response>
<message_infos>
<message_info>
<id>397300589</id>
<pdu_id>673399673</pdu_id>
<status>12</status>
<id>397300589</id>
<pdu_id>673399675</pdu_id>
<status>12</status>
</message_info>
<message_info>
<id>397300591</id>
<pdu_id>673399669</pdu_id>
<status>12</status>
<id>397300591</id>
<pdu_id>673399671</pdu_id>
<status>12</status>
</message_info>
</message_infos>
</response>'
SELECT
id = MIN(CASE WHEN RowNumGroup = 1 THEN val END)
, pdu_id = MIN(CASE WHEN RowNumGroup = 2 THEN val END)
, [status] = MIN(CASE WHEN RowNumGroup = 0 THEN val END)
FROM (
SELECT
val = t.c.value('(./text())[1]', 'BIGINT')
, RowNum = ROW_NUMBER() OVER (ORDER BY 1/0)
, RowNumGroup = ROW_NUMBER() OVER (ORDER BY 1/0) % 3
FROM @xml.nodes('/response/message_infos/message_info/*') t(c)
) t
GROUP BY RowNum - CASE WHEN RowNumGroup = 0 THEN 3 ELSE RowNumGroup END
2016 年 5 月 30 日更新
准备数据:
SET NOCOUNT ON
IF OBJECT_ID('tempdb.dbo.#xml') IS NOT NULL
DROP TABLE #xml
GO
CREATE TABLE #xml (data XML)
GO
INSERT INTO #xml
SELECT TOP(10000) N'
<response>
<message_infos>
<message_info>
<id>397300589</id>
<pdu_id>673399673</pdu_id>
<status>12</status>
<id>397300589</id>
<pdu_id>673399675</pdu_id>
<status>12</status>
</message_info>
<message_info>
<id>397300591</id>
<pdu_id>673399669</pdu_id>
<status>12</status>
<id>397300591</id>
<pdu_id>673399671</pdu_id>
<status>12</status>
</message_info>
</message_infos>
</response>'
FROM [master].dbo.spt_values
米凯尔·埃里克森
DECLARE @d DATETIME = GETDATE()
SELECT T.X.value('(id/text())[sql:column("N.N")][1]', 'INT') AS id,
T.X.value('(pdu_id/text())[sql:column("N.N")][1]', 'INT') AS pdu_id,
T.X.value('(status/text())[sql:column("N.N")][1]', 'INT') AS [status]
FROM #xml x
CROSS APPLY data.nodes('/response/message_infos/message_info') AS T(X)
CROSS APPLY (
VALUES
(1),(2),(3),(4),(5),
(6),(7),(8),(9),(10)
) AS N(N)
WHERE N.N <= T.X.value('count(id)', 'INT')
SELECT 'Mikael Eriksson: ' + CAST(CAST(GETDATE() - @d AS TIME) AS VARCHAR(100))
GO
Shnugo
DECLARE @d DATETIME = GETDATE()
WITH AllMessageInfos AS (
SELECT ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) AS Mi_Index
, mi.query('.') AS TheMI
FROM #xml x
CROSS APPLY data.nodes('/response/message_infos/message_info') AS A(mi)
)
, AllIDs AS (
SELECT Mi_Index
, ROW_NUMBER() OVER(PARTITION BY Mi_Index ORDER BY (SELECT NULL)) AS id_Index
, id.value('.','NVARCHAR(MAX)') AS id
FROM AllMessageInfos
CROSS APPLY TheMI.nodes('message_info/id') AS a(id)
)
, AllPdu_IDs AS (
SELECT Mi_Index
, ROW_NUMBER() OVER(PARTITION BY Mi_Index ORDER BY (SELECT NULL)) AS pdu_Index
, id.value('.','NVARCHAR(MAX)') AS pdu_id
FROM AllMessageInfos
CROSS APPLY TheMI.nodes('message_info/pdu_id') AS a(id)
)
, AllStatus AS (
SELECT Mi_Index
, ROW_NUMBER() OVER(PARTITION BY Mi_Index ORDER BY (SELECT NULL)) AS status_Index
, id.value('.', 'INT') AS status
FROM AllMessageInfos
CROSS APPLY TheMI.nodes('message_info/status') AS a(id)
)
SELECT i.Mi_Index AS MessageInfoIndex
, i.id_Index AS SubSetIndex
, i.id
, p.pdu_id
, s.[status]
FROM AllIDs AS i
JOIN AllPdu_IDs AS p ON i.Mi_Index = p.Mi_Index AND i.id_Index = p.pdu_Index
JOIN AllStatus AS s ON i.Mi_Index = s.Mi_Index AND i.id_Index = s.status_Index
SELECT 'Shnugo: ' + CAST(CAST(GETDATE()-@d AS TIME) AS VARCHAR(100))
GO
蒙泰维兹多
DECLARE @d DATETIME = GETDATE()
SELECT
m.value('for $i in . return count(../../*[. << $i])', 'INT') AS message_info_position,
m.value('for $i in . return count(../*[. << $i]) + 1', 'INT') AS internal_position,
m.value('fn:local-name(.)', 'SYSNAME') AS element_name,
m.value('.', 'NVARCHAR(4000)') AS element_value
FROM #xml x
CROSS APPLY data.nodes('/response/message_infos/message_info/*') AS A(m)
SELECT 'Montewhizdoh: ' + CAST(CAST(GETDATE()-@d AS TIME) AS VARCHAR(100))
GO
德瓦特(旧)
DECLARE @d DATETIME = GETDATE()
SELECT
id = MAX(CASE WHEN name = 'id' THEN val END)
, pdu_id = MAX(CASE WHEN name = 'pdu_id' THEN val END)
, [status] = MAX(CASE WHEN name = 'status' THEN val END)
FROM (
SELECT
name = t.c.value('local-name(.)', 'SYSNAME')
, val = t.c.value('.', 'INT')
, RowNum = ROW_NUMBER() OVER (ORDER BY 1/0)
, RowNumGroup = ROW_NUMBER() OVER (ORDER BY 1/0) % 3
FROM #xml x
CROSS APPLY data.nodes('/response/message_infos/message_info/*') t(c)
) t
GROUP BY RowNum - CASE WHEN RowNumGroup = 0 THEN 3 ELSE RowNumGroup END
SELECT 'Devart (OLD): ' + CAST(CAST(GETDATE()-@d AS TIME) AS VARCHAR(100))
GO
Devart(新)
DECLARE @d DATETIME = GETDATE()
SELECT
id = MIN(CASE WHEN RowNumGroup = 1 THEN val END)
, pdu_id = MIN(CASE WHEN RowNumGroup = 2 THEN val END)
, [status] = MIN(CASE WHEN RowNumGroup = 0 THEN val END)
FROM (
SELECT
val = t.c.value('(./text())[1]', 'BIGINT')
, RowNum = ROW_NUMBER() OVER (ORDER BY 1/0)
, RowNumGroup = ROW_NUMBER() OVER (ORDER BY 1/0) % 3
FROM #xml x
CROSS APPLY data.nodes('/response/message_infos/message_info/*') t(c)
) t
GROUP BY RowNum - CASE WHEN RowNumGroup = 0 THEN 3 ELSE RowNumGroup END
SELECT 'Devart (NEW): ' + CAST(CAST(GETDATE()-@d AS TIME) AS VARCHAR(100))
性能比较(Core i5 4460 3.2GHz,DDR3 8Gb,SQL Server 2014 SP1 Express):
Mikael Eriksson: 00:00:00.327
Shnugo: 00:00:00.913
Montewhizdoh: 00:00:01.680
Devart (OLD): 00:00:00.363
Devart (NEW): 00:00:00.200
关于sql-server - OPENXML 未返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37482259/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我一直在研究RubyKoans,我发现about_open_classes.rbkoan很有趣。特别是他们修改Integer#even?方法的最后一个测试。我想尝试一下这个概念,所以我打开了Irb并尝试运行Integer.respond_to?(:even?),但令我惊讶的是我得到了错误。然后我尝试了Fixnum.respond_to?(:even?)并得到了错误。我还尝试了Integer.respond_to?(:respond_to?)并得到了true,当我执行2.even?时,我也得到了true。我不知道发生了什么。谁能告诉我缺少什么? 最佳答案
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
无论时间在哪个时区表示,时区差异是否总是被忽略?直觉上,对于那些使用UTC+2的人来说,从EPOCH开始经过的秒数应该更高。然而,事实并非如此。 最佳答案 Epoch基于utc时区https://en.wikipedia.org/wiki/Unix_time它与您当前所在的时区无关。 关于ruby-Time.to_i是否总是以UTC返回自EPOCH以来的秒数?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.