-- two arguments, the first is the string or column to unpack, the second is the delimiter
select * from dbo.udf_unpack_address('streetXsomeplaceXsomestateXzip','X')
-- can easily handle CR
select * from dbo.udf_unpack_address('street'+char(13)+'someplace'+char(13)+'somestate'+char(13)+'zip',CHAR(13))
-- can combine with other string utilities
select * from dbo.udf_unpack_address(replace('street'+char(13)+'someplace'+char(13)+'somestate'+char(13)+'zip',char(13),char(9)),CHAR(9))
CREATE FUNCTION udf_unpack_address (@unstring varchar(2000), @delimiter varchar(1))
-- two arguments, the first is the string or column to unpack, the second is the delimiter
RETURNS @address table
(street varchar(100),
suburb varchar(100),
state varchar(100),
zip varchar(100))
AS
BEGIN
---Tab = char(9)
---Line feed = char(10)
---Carriage return = char(13)
DECLARE @startingposition int,
@delimiterposition int,
@unpackelement int
DECLARE @street varchar(100),
@suburb varchar(100),
@state varchar(100),
@zip varchar(100)
-- SET @delimiter = CHAR(13)
SET @startingposition = 0
SET @delimiterposition = 1
SET @unpackelement = 1
SET @unstring = @unstring+@delimiter
WHILE @delimiterposition > 0
BEGIN
SET @delimiterposition = charindex(@delimiter, @unstring, @startingposition + 1)
IF @delimiterposition > 0
BEGIN
IF @unpackelement < 2 set @street = substring(@unstring, @startingposition + 1, (@delimiterposition - @startingposition - 1))
IF @unpackelement = 2 set @suburb = substring(@unstring, @startingposition + 1, (@delimiterposition - @startingposition - 1))
IF @unpackelement = 3 set @state = substring(@unstring, @startingposition + 1, (@delimiterposition - @startingposition - 1))
IF @unpackelement > 3 set @zip = substring(@unstring, @startingposition + 1, (@delimiterposition - @startingposition - 1))
SET @unpackelement = @unpackelement + 1
END
SET @startingposition = @delimiterposition
END
INSERT @address values (@street,@suburb,@state,@zip)
RETURN
END
|