我的表中有一个 varchar 列,用于存储 xml 数据。是的,我知道我应该使用一个 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 语句中产生一个巨大的不可读字段,即使我将其移动到一个函数中,尝试弄清楚发生了什么仍然会令人困惑。
我确信有比这更简单的方法,因为它似乎是简单的字符串操作。也许有人可以指出我正确的方向。谢谢
最佳答案
您可以为此使用 XQuery - 只需将语句更改为:
SELECT
CAST(parms as xml).value('(/xml/@filename)[1]', 'varchar(260)') as p
FROM
dbo.Table1
这为您提供了一个足够长的 VARCHAR(260) 来保存任何有效的文件名和路径 - 现在您有了一个字符串并且可以使用 SUBSTRING 等对其进行处理。
马克
关于SQL Server xml字符串解析varchar字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1546431/