Dus*_*sty 6 sql t-sql sql-server xquery
我在表中有一个varchar列,用于存储xml数据.是的我知道我应该使用xml数据类型,但我认为这是在xml数据类型可用之前设置的,所以varchar是我现在必须使用的.:)
存储的数据类似于以下内容:
<xml filename="100100_456_484351864768.zip"
event_dt="10/5/2009 11:42:52 AM">
<info user="TestUser" />
</xml>
Run Code Online (Sandbox Code Playgroud)
我需要解析文件名以获取两个下划线之间的数字,在这种情况下将是"456".文件名的第一部分"不应该"改变长度,但中间的数字会改变.我需要一个解决方案,如果第一部分确实改变了长度(你知道它会改变,因为"不应该改变"似乎总是意味着它会改变).
对于我现在所拥有的,我使用XQuery来提取文件名,因为我认为这可能比直接字符串操作更好.我将字符串转换为xml来执行此操作,但我不是XQuery专家,所以当然我遇到了问题.我找到了一个XQuery函数(substring-before),但无法使它工作(我甚至不确定该函数是否适用于SQL Server).可能有一个XQuery函数很容易做到这一点,但如果有我不知道它.
所以,我从表中获取类似于以下内容的文件名:
select CAST(parms as xml).query('data(/xml/@filename)') as p
from Table1
Run Code Online (Sandbox Code Playgroud)
从这里我可以假设我能够将它返回到一个字符串,然后执行一些instring或charindex函数来确定下划线的位置,以便我可以将所有这些封装在子字符串函数中以挑选出该部分我需要.没有太深入,我很确定我最终可以通过这种方式完成它,但我知道必须有一个更简单的方法.这种方式会在SQL语句中产生一个巨大的不可读字段,即使我将其移动到函数中,仍然会混淆尝试弄清楚发生了什么.
我确信有一个比这更容易,因为它似乎是简单的字符串操作.也许有人可以指出我正确的方向.谢谢
您可以使用XQuery - 只需将语句更改为:
SELECT
CAST(parms as xml).value('(/xml/@filename)[1]', 'varchar(260)') as p
FROM
dbo.Table1
Run Code Online (Sandbox Code Playgroud)
这给你一个VARCHAR(260)足够长的时间来保存任何有效的文件名和路径 - 现在你有一个字符串,可以使用SUBSTRING等工作.
渣