Если CLR не вариант, то, что предложил Питер, замечательно.Однако, поскольку вы сказали, что у вас есть SQL #, вы можете сделать это более простым и функциональным способом, используя функцию RegEx_MatchSimple в SQL #.Я объясню, используя пример Питера в качестве отправной точки.
Мы можем настроить тест, используя почти тот же SQL, который использовал Питер, но в этом случае я создам таблицу суффиксов как реальную (не временную) таблицутак что я могу сослаться на это в одном из примеров TVF ниже.Возможно, вы захотите сохранить их в таблице, а не передавать в качестве параметра, но я покажу оба стиля.Я также добавил два имени в таблицу #Names, чтобы показать, как использование RegEx может помочь зафиксировать изменения в данных (дополнительные пробелы и / или запятые):
USE [tempdb]
GO
IF OBJECT_ID('tempdb..#Names') IS NOT NULL DROP TABLE #Names
IF OBJECT_ID('tempdb.dbo.Suffixes') IS NOT NULL DROP TABLE dbo.Suffixes
CREATE TABLE #Names (LastName VARCHAR(32))
CREATE TABLE dbo.Suffixes (Suffix VARCHAR(32))
GO
INSERT #Names VALUES ('BRUNNING, II' )
INSERT #Names VALUES ('BURCH II' )
INSERT #Names VALUES ('BUSS, JR.' )
INSERT #Names VALUES ('CANI III' )
INSERT #Names VALUES ('CHRISTIAN,SR' )
INSERT #Names VALUES ('COLVIN Jr' )
INSERT #Names VALUES ('COWHERD,JR.' )
INSERT #Names VALUES ('BILLY BOB' )
INSERT #Names VALUES ('JOHNNY' )
INSERT #Names VALUES ('BRUNNING, II ' )
INSERT #Names VALUES ('SMITH ,, SR. ' )
INSERT dbo.Suffixes VALUES ('II' )
INSERT dbo.Suffixes VALUES ('III')
INSERT dbo.Suffixes VALUES ('JR' )
INSERT dbo.Suffixes VALUES ('SR' )
Первое, что нужно показать, - это простой примерэто работает с вышеуказанными данными.В этом случае я использую CTE, чтобы сгенерировать список совпадений с именами, а затем отфильтровать строки, которые ничего не совпадают.Я заключил поле [FullMatch] в двоеточия, чтобы было легче увидеть захваченные начальные и конечные пробелы:
;WITH cte AS (
SELECT names.LastName,
[SQL#].[SQL#].RegEx_MatchSimple(names.LastName, '(([ ]*,+[ ]*)|([ ]+))' + suff.Suffix + '[.]*[ ]*$', 1, 'IgnoreCase') AS [FullMatch],
suff.suffix
FROM #Names names
CROSS JOIN tempdb.dbo.Suffixes suff
)
SELECT cte.LastName, ':' + cte.FullMatch + ':' AS [FullMatch], REPLACE(cte.LastName, cte.FullMatch, '') AS [Replacement], cte.Suffix
FROM cte
WHERE cte.FullMatch <> ''
Вы можете перенести эту теорию в прямой оператор UPDATE:
;WITH cte AS (
SELECT names.LastName,
[SQL#].[SQL#].RegEx_MatchSimple(names.LastName, '(([ ]*,+[ ]*)|([ ]+))' + suff.Suffix + '[.]*[ ]*$', 1, 'IgnoreCase') AS [FullMatch],
suff.Suffix
FROM MyTable names
CROSS JOIN NameSuffixes suff
)
UPDATE mt
SET mt.LastName = REPLACE(cte.LastName, cte.FullMatch, ''),
mt.NameSuffix = cte.Suffix
FROM MyTable mt
INNER JOIN cte
ON cte.LastName = mt.LastName
WHERE cte.FullMatch <> ''
Вы запросили это как функцию, которая выглядит следующим образом:
CREATE FUNCTION dbo.ParseNameAndSuffix (@Name VARCHAR(64))
RETURNS TABLE AS RETURN
(
WITH cte AS (
SELECT @Name AS [LastName],
[SQL#].[SQL#].RegEx_MatchSimple(@Name, '(([ ]*,+[ ]*)|([ ]+))' + suff.Suffix + '[.]*[ ]*$', 1, 'IgnoreCase') AS [FullMatch],
suff.Suffix
FROM tempdb.dbo.Suffixes suff
)
SELECT cte.LastName, cte.FullMatch, REPLACE(cte.LastName, cte.FullMatch, '') AS [Replacement], cte.Suffix
FROM cte
WHERE cte.FullMatch <> ''
)
GO
И может использоваться следующим образом:
SELECT *
FROM #Names a
CROSS APPLY dbo.ParseNameAndSuffix(a.LastName) b
-- or --
UPDATE mt
SET mt.LastName = REPLACE(parse.LastName, parse.Found, ''),
mt.NameSuffix = parse.Suffix
FROM MyTable mt
CROSS APPLY dbo.ParseNameAndSuffix(mt.LastName) parse
Чтобы более точно соответствовать примеру, приведенномуПитер, который передал суффиксы в качестве параметра, что можно сделать следующим образом, используя функцию String_Split в SQL #:
CREATE FUNCTION dbo.ParseNameAndSuffix2 (@Name VARCHAR(64), @Suffixes VARCHAR(MAX))
RETURNS TABLE AS RETURN
(
WITH cte AS (
SELECT @Name AS [LastName],
[SQL#].[SQL#].RegEx_MatchSimple(@Name, '(([ ]*,+[ ]*)|([ ]+))' + suff.Val + '[.]*[ ]*$', 1, 'IgnoreCase') AS [FullMatch],
suff.Val AS [Suffix]
FROM [SQL#].[SQL#].String_Split(@Suffixes, ';', 2) suff
)
SELECT cte.LastName, cte.FullMatch, REPLACE(cte.LastName, cte.FullMatch, '') AS [Replacement], cte.Suffix
FROM cte
WHERE cte.FullMatch <> ''
)
GO
, которую затем можно использовать следующим образом:
SELECT * FROM #Names a
CROSS APPLY dbo.ParseNameAndSuffix2(a.LastName, 'II;III;JR;SR') b
-- or --
UPDATE mt
SET mt.LastName = REPLACE(parse.LastName, parse.Found, ''),
mt.NameSuffix = parse.Suffix
FROM MyTable mt
CROSS APPLY dbo.ParseNameAndSuffix2(mt.LastName, 'II;III;JR;SR') parse