草庐IT

sql-server - 从 SQL 子查询的 XML 下拉列表中返回选定值

coder 2024-07-01 原文

我有一个数据库,它在 XML 列中存储表单的结果。不幸的是,它还在开头存储了一些无法直接解析的额外字符,因此我需要在解析值之前删除它们。我的另一个限制是我用来显示报告的系统 (Xtraction) 只允许运行子查询。

尽管存在所有这些限制,但我有一个成功的方法可以从 XML 字段中获取文本值,但我似乎无法将其应用于下拉列表中的选定值。我的方法不仅返回所选值,还返回所有下拉选项以及非分隔字符串。

由于表单非常大,我删除了除多余字符和下面 XML 的下拉部分之外的所有内容:

_RCFM*=.hÞ<form><select id="Dropdown01" label="Substantive APS Level:"
mandatory="true" readonly="false" style="combo" type="string" 
visible="true">EL1<option label=""/><option 
label="APS5">APS5</option><option label="APS6">APS6</option><option 
label="EL1">EL1</option></select></form>

我使用的子查询是:

(SELECT  
x.CARTITEMID
, x.DROPDOWN01
FROM (
SELECT 
    CARTITEMID
   , CAST(RIGHT(cast(cast(SVCCARTITEMM1.OPTIONS as varbinary(max)) as varchar(max)),
   LEN(cast(cast(SVCCARTITEMM1.OPTIONS as varbinary(max)) as varchar(max)))
   -CHARINDEX('<form>',cast(cast(SVCCARTITEMM1.OPTIONS as varbinary(max)) as varchar(max)))+1)
   AS XML).value('(/form/select[@id="Dropdown01"])[1]', 'varchar(max)')[DROPDOWN01]

FROM SVCCARTITEMM1) x
)

上述子查询的结果是: EL1APS5APS6EL1

我只需要返回选定的文本,在本例中是字符串中的初始“EL1”。

请注意,从 CAST 到“AS XML”的代码通常是字段引用所在的位置,这就是我用来转换和删除提到的前导字符的代码。

请帮忙,我真的很努力地找到了解决这个相当晦涩的问题的方法。

最佳答案

节点的值(value)是它的全部内容。试试这个:

DECLARE @x XML=
'<x>hallo1
    <a>testa</a>
   hallo2
    <b>testb</b>
   hallo3
</x>';

SELECT x.value('.','nvarchar(max)') AS EntireContent
      ,x.value('(./text())[1]','nvarchar(max)') AS FirstText
      ,x.value('(./text())[2]','nvarchar(max)') AS SecondText
      ,x.value('(./a)[1]','nvarchar(max)') AS DeeperNode --might use `text()` here as well
FROM @x.nodes('/x') AS A(x);

您没有说明列的数据类型。由于有前导字符,这不能是XML。您的代码让我认为它是某种文本。我认为您的整个查询都可以简化:

DECLARE @YourTbl TABLE(OPTIONS NVARCHAR(MAX));
INSERT INTO @YourTbl VALUES
(N'_RCFM*=.hÞ<form><select id="Dropdown01" label="Substantive APS Level:"
mandatory="true" readonly="false" style="combo" type="string" 
visible="true">EL1<option label=""/><option 
label="APS5">APS5</option><option label="APS6">APS6</option><option 
label="EL1">EL1</option></select></form>');

SELECT Casted.value(N'(/form/select[@id="Dropdown01"]/text())[1]','nvarchar(max)')
FROM @YourTbl AS t
CROSS APPLY(SELECT CAST(SUBSTRING(t.OPTIONS,CHARINDEX('<',t.OPTIONS),10000) AS XML)) AS A(Casted)

如果您的列的数据类型是 IMAGE 或 TEXT(已弃用超过 10 年,但您的代码可能指向另一种选择),请尝试以下操作:

SELECT AsXML.value(N'(/form/select[@id="Dropdown01"]/text())[1]','nvarchar(max)')
FROM @YourTbl AS t
CROSS APPLY(SELECT CAST(CAST(t.OPTIONS AS VARBINARY(MAX)) AS VARCHAR(MAX))) AS A(AsString)
CROSS APPLY(SELECT CAST(SUBSTRING(AsString,CHARINDEX('<',AsString),10000) AS XML)) AS B(AsXML)

注意 如果第二个抛出类似无效字符的错误,尝试在第一个CROSS APPLY中使用NVARCHAR > 代替 AS VARCHAR

关于sql-server - 从 SQL 子查询的 XML 下拉列表中返回选定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41113948/

有关sql-server - 从 SQL 子查询的 XML 下拉列表中返回选定值的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby - RVM 使用列表[0] - 2

    是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论

  5. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  6. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  7. ruby - Ruby 中的隐式返回值是怎么回事? - 2

    所以我开始关注ruby​​,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出

  8. ruby-on-rails - ruby 日期方程不返回预期的真值 - 2

    为什么以下不同?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

  9. ruby - 从 String#split 返回的零长度字符串 - 2

    在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"

  10. Hive SQL 五大经典面试题 - 2

    目录第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以上的用户分析:遇到这类

随机推荐