Вы можете попробовать что-то подобное:
DECLARE @tbl TABLE(YourString VARCHAR(100));
INSERT INTO @tbl VALUES
('My Code in ''ABC123, CDE456'' and my digit 1')
,('My Code in ''ABC123, CDE456''');
SELECT t.YourString
,A.CastedToXml.query('.') AS ThisIsHowItLooksLike
,A.CastedToXml.value('/x[2]','varchar(100)') AS TheSecondElement
FROM @tbl t
CROSS APPLY(SELECT CAST('<x>' + REPLACE(t.YourString,'''','</x><x>') + '</x>' AS XML)) A(CastedToXml);
Щелкните по узлу XML, чтобы увидеть промежуточное приведенное значение.Мы можем использовать .value()
, чтобы выбрать вторую <x>
, которая является вашими данными.
В качестве альтернативы вы можете следовать своему собственному подходу:
DECLARE @KnownBeginning nvarchar(400) = 'Code in ''',
@KnownEnding nvarchar(400) = ''''; --<-- Without the blank!
SELECT t.YourString
,SUBSTRING(t.YourString,A.StartPosition,B.EndPosition-A.StartPosition) AS TheCodes
FROM @tbl t
CROSS APPLY(SELECT CHARINDEX(@KnownBeginning,t.YourString) + LEN(@KnownBeginning)) A(StartPosition)
OUTER APPLY(SELECT CHARINDEX(@KnownEnding,t.YourString,A.StartPosition+1)) B(EndPosition);
Я использую APPLY
длявычислить значения построчно .Это позволяет использовать вычисленные значения, подобные переменным, в процедурных подходах.Первый APPLY
вычисляет начальную точку, а второй APPLY
использует StartPosition в качестве смещения .Поэтому нам не нужен бланк после цитаты.