如果您可以选择使用基于 SQLCLR 的函数,那么您可以使用正则表达式来简单地删除一个或多个匹配的后缀。RegEx“替换”可以在单个调用中匹配任意数量的后缀(使用管道“|”来“或”后缀)并将每个后缀替换为空字符串。正则表达式可以轻松匹配每个后缀之前的字符组合:空格、逗号(示例数据中的两个),以及逗号和空格,甚至空格加逗号加空格。这种方法允许姓氏中包含空格。您可以填充后缀表(根据您的要求),但无需存储删除后缀的逻辑。
以下示例使用包含RegEx_Replace函数的SQL#库。我是SQL#的作者,但是这个函数是免费版的。或者,如果您只想要一个没有所有其他功能的 RegEx“替换”功能,那么各种论坛/博客/文章/等上有很多示例。
在下面的示例中,我包括了两个额外的测试用例:一个带有逗号和空格(表明两者都被删除),另一个没有定义为后缀(表明它之前的空格没有被删除)。
DECLARE @TestNames TABLE (LastName NVARCHAR(50));
INSERT INTO @TestNames VALUES
(N'SMITH MD'),
(N'GEORGE MD PHD'),
(N'SMITH MD LLC'),
(N'SMTITH JR MD'),
(N'SMITH III MD PA'),
(N'SMITH,MD'),
(N'SMITH, IV'),
(N'SMITH NotDefined');
DECLARE @NameSuffixes TABLE (Suffix NVARCHAR(50));
INSERT INTO @NameSuffixes VALUES
(N'MD'),
(N'PHD'),
(N'llc'),
(N'II'),
(N'III'),
(N'iv'),
(N'jr'),
(N'pa');
-- Pattern =
-- (([, ]+MD\b)|([, ]+PHD\b)|([, ]+llc\b)|([, ]+II\b)|([, ]+III\b)|...)
DECLARE @SuffixList NVARCHAR(4000) = N'(';
SELECT @SuffixList += N'([, ]+' + Suffix + N'\b)|'
FROM @NameSuffixes;
SET @SuffixList += N')';
SELECT tn.LastName,
SQL#.RegEx_Replace(tn.LastName, @SuffixList, '', -1, 1, N'IgnoreCase') + N'~'
FROM @TestNames tn;
请注意,~
附加到每个过滤值只是为了表明没有尾随空格。