我在用于存储 xml 数据的表中有一个 varchar 列。是的,我知道我应该使用 xml 数据类型,但我认为这是在 xml 数据类型可用之前设置的,所以我现在必须使用 varchar。:)
存储的数据类似于以下内容:
<xml filename="100100_456_484351864768.zip"
event_dt="10/5/2009 11:42:52 AM">
<info user="TestUser" />
</xml>
我需要解析文件名以获取两个下划线之间的数字,在这种情况下为“456”。文件名的第一部分“不应该”改变长度,但中间的数字会。如果第一部分的长度确实发生了变化,我需要一个可行的解决方案(你知道它会改变,因为“不应该改变”似乎总是意味着它会改变)。
对于我现在所拥有的,我正在使用 XQuery 提取文件名,因为我认为这可能比直接字符串操作更好。我将字符串转换为 xml 来执行此操作,但我不是 XQuery 专家,所以我当然会遇到问题。我找到了一个 XQuery 函数(substring-before),但无法让它工作(我什至不确定该函数是否可以与 SQL Server 一起工作)。可能有一个 XQuery 函数可以轻松执行此操作,但如果有我不知道。
因此,我使用类似于以下内容的查询从表中获取文件名:
select CAST(parms as xml).query('data(/xml/@filename)') as p
from Table1
由此我假设我可以将它转换回一个字符串,然后执行一些 instring 或 charindex 函数来确定下划线的位置,以便我可以将所有这些封装在一个子字符串函数中以挑选出部分我需要。无需过多讨论,我很确定我最终可以通过这种方式完成它,但我知道必须有一种更简单的方法。这种方式会在 SQL 语句中产生一个巨大的不可读字段,即使我将它移到一个函数中,试图弄清楚发生了什么仍然会令人困惑。
我敢肯定有比这更容易的,因为它似乎是简单的字符串操作。也许有人可以指出我正确的方向。谢谢