PatExclude8K

, 2016-06-10 (first published: )

Updated on 5/16/2015

Updated the code to deal with XML characters in the output. 

Examples of how to use:

-- remove letters

SELECT * FROM dbo.PatExclude8K('abc123!', '[a-z]');
Returns: 123!
-- remove numbers
SELECT * FROM dbo.PatExclude8K('abc123!', '[0-9]');
Returns: abc!
-- only include letters and numbers 
SELECT * FROM dbo.PatExclude8K('###abc123!!!', '[^0-9a-z]');
Returns: abc123
-- Remove spaces (note the spaces)
SELECT * FROM dbo.PatExclude8K('XXX 123 ZZZ', '['+char(32)+']');
Returns: XXX123ZZZ
-- only include letters and "!, ? or ."
SELECT * FROM dbo.PatExclude8K('123# What?!... ', '[^a-z!?.]')
Returns: What?!...
-- Using with make_parallel():
SELECT * FROM dbo.PatExclude8K('XXX 123 ZZZ', '['+char(32)+']')
CROSS APPLY make_parallel();
CREATE FUNCTION dbo.PatExclude8K
(
    @String VARCHAR(8000),
	@Pattern VARCHAR(50)
) 
/*******************************************************************************
 Purpose:
 Given a string (@String) and a pattern (@Pattern) of characters to remove, 
 remove the patterned characters from the string.

Usage:
--===== Basic Syntax Example
 SELECT CleanedString 
 FROM dbo.PatExclude8K(@String,@Pattern);

--===== Remove all but Alpha characters
 SELECT CleanedString 
 FROM dbo.SomeTable st
 CROSS APPLY dbo.PatExclude8K(st.SomeString,'%[^A-Za-z]%');

--===== Remove all but Numeric digits
 SELECT CleanedString
 FROM dbo.SomeTable st
 CROSS APPLY dbo.PatExclude8K(st.SomeString,'%[^0-9]%');

 Programmer Notes:
 1. @Pattern is not case sensitive (the function can be easily modified to make it so)
 2. There is no need to include the "%" before and/or after your pattern since since we 
	are evaluating each character individually

 Revision History:
 Rev 00 - 10/27/2014 Initial Development - Alan Burstein

 Rev 01 - 10/29/2014 Mar 2007 - Alan Burstein
		- Redesigned based on the dbo.STRIP_NUM_EE by Eirikur Eiriksson
		  (see: http://www.sqlservercentral.com/Forums/Topic1585850-391-2.aspx)
		- change how the cte tally table is created 
		- put the include/exclude logic in a CASE statement instead of a WHERE clause
		- Added Latin1_General_BIN Colation
        - Add code to use the pattern as a parameter.

 Rev 02	- 11/6/2014
		- Added final performane enhancement (more cudo's to Eirikur Eiriksson)
		- Put 0 = PATINDEX filter logic into the WHERE clause

Rev 03 - 5/16/2015
		- Updated code to deal with special XML characters
*******************************************************************************/
RETURNS TABLE WITH SCHEMABINDING AS
RETURN
WITH
E1(N) AS (SELECT N FROM (VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) AS X(N)),
itally(N) AS 
(
  SELECT TOP(CONVERT(INT,LEN(@String),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
  FROM E1 T1 CROSS JOIN E1 T2 CROSS JOIN E1 T3 CROSS JOIN E1 T4
) 
SELECT NewString =
((
  SELECT SUBSTRING(@String,N,1)
  FROM iTally
  WHERE 0 = PATINDEX(@Pattern,SUBSTRING(@String COLLATE Latin1_General_BIN,N,1))
  FOR XML PATH(''),TYPE
).value('.[1]','varchar(8000)'));
GO

Rate

4.89 (9)

Share

Share

Rate

4.89 (9)

Related content