In SQL Server 2022, the behavior of LTrim (left trimming) and RTrim (right trimming) functions was extended with one more string parameter. When provided, the engine checks whether the first parameter starts (for LTrim), respectively ends (for RTrim) with the respective value and removes it, the same as the space character char(32) was removed previously:
-- prior behavior of LTrim/RTrim DECLARE @text as nvarchar(50) = ' 123 ' SELECT '(' + LTrim(@text) + ')' LeftTrimming , '(' + RTrim(@text) + ')' RightTrimming , '(' + Ltrim(RTrim(@text)) + ')' Trimming1 -- prior SQL Server 2017 , '(' + Trim(@text) + ')' Trimming2 -- starting with SQL 2017
LeftTrimming | RightTrimming | Trimming1 | Trimming2 |
(123 ) | ( 123) | (123) | (123) |
Here's the new behavior:
-- extended behavior of LTrim/LTrim (SQL Server 2022+) DECLARE @text as nvarchar(50) = '123abc123abc' SELECT LTrim(@text , '123') LeftTrimming , RTrim(@text , 'abc') RightTrimming;
LeftTrimming | RightTrimming |
abc123abc | 123abc123 |
Previously, to obtain the same result one could write something like:
-- prior solution via Left/Right for the same (SQL Server 2000+) DECLARE @text as nvarchar(50) = '123abc123abc' SELECT CASE WHEN Left(@text, 3) = '123' THEN Right(@text,Len(@text)-3) ELSE @text END LeftTrimming , CASE WHEN Right(@text, 3) = 'abc' THEN Left(@text,Len(@text)-3) ELSE @text END RightTrimming -- prior solution via "LIKE" for the same (SQL Server 2000+) DECLARE @text as nvarchar(50) = '123abc123abc' SELECT CASE WHEN @text LIKE '123%' THEN Right(@text,Len(@text)-3) ELSE @text END LeftTrimming , CASE WHEN @text LIKE '%abc' THEN Left(@text,Len(@text)-3) ELSE @text END RightTrimming
As can be seen, the syntax is considerable simplified. However, there are few the situations when is needed. In the past I had to write code to remove parenthesis, quotes or similar characters:
-- removing parantheses DECLARE @text as nvarchar(50) = '(testing)' SELECT LTrim(@text , '(') LeftTrimming , RTrim(@text , ')') RightTrimming , RTrim(LTrim(Trim(@text), '('), ')') Trimming -- removing double quotes DECLARE @text as nvarchar(50) = '"testing"' SELECT LTrim(@text , '"') LeftTrimming , RTrim(@text , '"') RightTrimming , RTrim(LTrim(Trim(@text), '"'), '"') Trimming
The Trim for the 3rd value in both queries was used to remove the eventual spaces before the character to be replaced:
-- removing paranteses with lead/end spaces SELECT RTrim(LTrim(Trim(' (testing) '), '('), ')');
Then I thought, maybe I could use the same to remove the tags from an XML element. I tried the following code and unfortunately it doesn't seem to work:
-- attempting to remove the start/end tags from xml elements DECLARE @text as nvarchar(50) = '<string>testing</string>' SELECT LTrim(@text , '<string>') LeftTrimming , RTrim(@text , '</string>') RightTrimming , RTrim(LTrim(Trim(@text), '<string>'), '</string>') Trimming
LeftTrimming | RightTrimming | Trimming |
esting</string> | <string>te | e |
That's quite an unpleasant surprise! In exchange, the value type can be defined as XML and use the following code to obtain the needed result:
-- extracting the value from a tag element DECLARE @text XML = '<string>testing</string>' SELECT @text.query('data(/string)') as value