Один из способов сделать это - использовать функцию и передать этой функции текстовый раздел для чтения, разделитель и тест.
Я использую следующую функцию для таких вещей, как ваше требование ..
Сначала - создайте функцию, подобную следующей
CREATE FUNCTION [dbo].[fnParseString]
(
@Section SMALLINT,
@Delimiter CHAR,
@Text varchar(1000)
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @NextPos SMALLINT,
@LastPos SMALLINT,
@Found SMALLINT
IF @Section > 0
SELECT @Text = REVERSE(@Text)
SELECT @NextPos = CHARINDEX(@Delimiter, @Text, 1),
@LastPos = 0,
@Found = 1
WHILE @NextPos > 0 AND ABS(@Section) <> @Found
SELECT @LastPos = @NextPos,
@NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1),
@Found = @Found + 1
RETURN CASE
WHEN @Found <> ABS(@Section) OR @Section = 0 THEN NULL
WHEN @Section > 0 THEN REVERSE(SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END))
ELSE SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)
END
END
Затем используйте ее следующим образом:
select [dbo].[fnParseString] (11,'','Anna Campbell Flat 9 1153B Great South Road Epsom Auckland 1050') as first_name
Анна.
select [dbo].[fnParseString] (10,'','Anna Campbell Flat 9 1153B Great South Road Epsom Auckland 1050') as last_name
Кэмпбелл
Вы поймете идею ... Это всего лишь один из способов сделать это ... и не надежный способ получить имена и адреса, так как у вас может быть больше на меньшеепробелы в адресе. Великий Юг и Великий Южный дадут разные результаты.