我正在寻找一个函数,将能够做与TSQL函数的MySQL相同的事情。基本上,我需要我的查询看起来像下面这样:
SELECT * FROM Routing WHERE (@Message REGEX RouteRegex);在这一点上我并不热衷于使用CLR。
有什么想法吗?
发布于 2009-06-08 14:44:53
这有点像用锤子做黄油吐司,但是您可以通过pattern facet在xml数据类型中使用正则表达式支持。然后,通过尝试解析为类型化的xml来确定正则表达式是否匹配,如果跳到catch块并返回错误6926,则正则表达式不匹配(简单类型验证错误)。下面是一个强制使用3位十进制数字后跟6个字母的正则表达式的示例:
create xml schema collection regexTest1 as '<xs:schema targetNamespace="http://example/regexTest"
elementFormDefault="qualified"
xmlns="http://example/regexTest"
xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="regexTest">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="\p{Nd}{3}\p{L}{6}"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>'
declare @x xml(dbo.regexTest1), @regexPass bit
begin try
set @x = '<regexTest xmlns="http://example/regexTest">111abcdef</regexTest>'
set @regexPass=1
end try
begin catch
if (error_number()=6926)
begin
set @regexPass=0
end
else begin
declare @errMsg varchar(8000), @errSev int, @errState int
select @errMsg='Regex check was unable to process, native error: ('
+ cast(error_number() as varchar(16))
+ ') - '
+ error_message(),
@errSev=error_severity(),
@errState=error_state()
raiserror(@errMsg, @errSev, @errState)
end
end catch
select @regexPassEdit -如果走这条路,在XSD中支持正则表达式的规范在http://www.w3.org/TR/xmlschema-2/#dt-regex
https://stackoverflow.com/questions/965026
复制相似问题