我有一个从数据库返回数据的查询。在单个字段中,有一个相当长的文本注释,其中包含一个段,使用!markerstart!
和!markerend!
等标记标记进行明确定义。我希望有一个查询返回,并删除两个标记之间的字符串段(并删除标记)。
我通常会在收到数据后执行此客户端,但问题是查询是INSERT
查询,它从SELECT
语句中获取数据。我不希望文本段存储在存档/报告表中(在此处使用OLTP应用程序),因此我需要找到一种方法来获取SELECT
语句以准确返回要插入的内容,在这种情况下,意味着获取SELECT
语句以去除不需要的短语,而不是在客户端的后处理中执行。
我唯一的想法是使用SUBSTRING
,CHARINDEX
和CONCAT
的一些复杂组合,但我希望有更好的方法,但是,基于{{3我不明白怎么回事。有人有想法吗?
样品:
这是数据库中某个字段中的一长串文本,其中包含需要删除的段。 !markerstart!这是要删除的段。它的长度是未知的和可变的。 !markerend!标记后面出现的该字段部分应保留。
结果:
这是数据库中某个字段中的一长串文本,其中包含需要删除的段。标记后面出现的该字段部分应保留。
使用STUFF的解决方案:
我真的不喜欢这是多么冗长,但如果我真的需要,我可以把它放在一个函数中。它并不理想,但它比CLR例程更容易,更快。
SELECT STUFF(CAST(Description AS varchar(MAX)), CHARINDEX('!markerstart!', Description), CHARINDEX('!markerend!', Description) + 11 - CHARINDEX('!markerstart!', Description), '') AS Description
FROM MyTable
答案 0 :(得分:2)
您可能需要考虑实现一个返回已解析数据的CLR用户定义函数。
以下链接演示了如何使用CLR UDF RegEx函数进行模式匹配和数据提取。
http://msdn.microsoft.com/en-us/magazine/cc163473.aspx
此致
答案 1 :(得分:0)
您可以使用填充功能或替换功能,并用''替换不需要的符号。 STUFF( 'EXP',START_POS, 'NUMBER_OF_CHARS', 'REPLACE_EXP')