Это немного похоже на использование молотка для приготовления тоста с маслом, но вы можете использовать поддержку регулярных выражений в типе данных 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 @regexPass
Редактировать - если вы идете по этому пути, спецификация для поддержки регулярных выражений в XSD находится на http://www.w3.org/TR/xmlschema-2/#dt-regex