January 14, 2011 at 7:32 pm
Jeff Moden (1/14/2011)
Lowell (1/4/2011)
this is the ProperCase function I use; it's from a post by Jeff Moden, i believe, harvested long long ago.
This may be the source....
http://www.sqlservercentral.com/Forums/FindPost644446.aspx
MM
select geometry::STGeomFromWKB(0x0106000000020000000103000000010000000B0000001000000000000840000000000000003DD8CCCCCCCCCC0840000000000000003DD8CCCCCCCCCC08408014AE47E17AFC3F040000000000104000CDCCCCCCCCEC3F9C999999999913408014AE47E17AFC3F9C99999999991340000000000000003D0000000000001440000000000000003D000000000000144000000000000000400400000000001040000000000000F03F100000000000084000000000000000401000000000000840000000000000003D0103000000010000000B000000000000000000143D000000000000003D009E99999999B93F000000000000003D009E99999999B93F8014AE47E17AFC3F400000000000F03F00CDCCCCCCCCEC3FA06666666666FE3F8014AE47E17AFC3FA06666666666FE3F000000000000003D1800000000000040000000000000003D18000000000000400000000000000040400000000000F03F000000000000F03F000000000000143D0000000000000040000000000000143D000000000000003D, 0);
January 14, 2011 at 8:45 pm
Jeff Moden (1/14/2011)
Wow! I just took a closer look at the code above. If I actually was the one who wrote that, I'm awfully sorry. :sick: I must have been under the influence of some pretty nasty cold medicine or something. It doesn't even work for words with more than one leading space and I'm pretty sure I would use STUFF nowadays instead of overloading a variable like that. The formatting in the CTE's isn't my typical formatting and I'm almost religious about using 2 part naming conventions when creating SQL objects. I'm also fairly religious about aliasing the Tally table as "t" and I don't believe I've ever used "Tally.N" in my code... its always (AFAIR) just "t.N".If it really is mine, give me the link so I can go back and fix it because it's absolutely terrible.
I take it back. It does work for multiple leading spaces. The stuff that looks like spaces in sys.syscomments in the GRID mode are actually spaces... most of the are CrLf characters
--Jeff Moden
Change is inevitable... Change for the better is not.
January 14, 2011 at 8:56 pm
mister.magoo (1/14/2011)
Jeff Moden (1/14/2011)
Lowell (1/4/2011)
this is the ProperCase function I use; it's from a post by Jeff Moden, i believe, harvested long long ago.This may be the source....
Thanks, Magoo...
That's a whole lot cleaner code but I still don't believe it's mine because I just don't use "Tally.N" anywhere. The truth is, I believe that Lowell came up with that slice of computational heaven on his own and forgot about it simply because it used a Tally Table.
So, nice job Lowell! 🙂 Really nice job because I don't know what the heck I wrote before for where I said the loop beat it. And, if I find it, I won't post it because it must've been pretty bad. :hehe:
--Jeff Moden
Change is inevitable... Change for the better is not.
January 14, 2011 at 9:46 pm
Ok... if I had to write such a thing today, here's how I'd probably write it... it's pretty fast, too, although I'm sure someone will come up with a way to turn it into a much faster iTVF. 🙂
CREATE FUNCTION dbo.ProperCase_JBM
/***************************************************************************************************
Purpose:
Capitalize letters that follow a space.
Rev History:
Rev 00 - 14 Jan 2011 - Jeff Moden - Initial Creation
***************************************************************************************************/
--===== Define I/O parameters
(
@pString VARCHAR(8000)
)
RETURNS VARCHAR(8000)
WITH SCHEMABINDING
AS
BEGIN
--===== Change all characters to lower case
DECLARE @CleanedText VARCHAR(8000)
;
SELECT @CleanedText = LOWER(@pString)
;
--===== "Inline" CTE Driven "Tally Table" produces values up to
-- 10,000... enough to cover VARCHAR(8000)
WITH
E1(N) AS ( --=== Create Ten 1's
SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 --10
),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --100
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10,000
cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT N)) FROM E4)
--===== Find and capitalize only where a letter follows a space
SELECT @CleanedText = STUFF(@CleanedText, t.N, 1, UPPER(SUBSTRING(@CleanedText, t.N, 1)))
FROM cteTally t
WHERE t.N BETWEEN 1 AND LEN(@pString)
AND (
SUBSTRING(@CleanedText,t.N-1,2) LIKE '[ ][a-z]' COLLATE Latin1_General_Bin
OR
t.N = 1
)
;
RETURN @CleanedText
;
END
;
--Jeff Moden
Change is inevitable... Change for the better is not.
Viewing 4 posts - 31 through 33 (of 33 total)
You must be logged in to reply to this topic. Login to reply