Don't overly like.
Off the top of my head: -
DECLARE @caps VARCHAR(24),
@lower VARCHAR(25),
@numbers VARCHAR(8),
@string VARCHAR(250)
SET @caps = 'ABCDEFGHJKLMNPQRSTUVWXYZ'
SET @lower = 'abcdefghijkmnopqrstuvwxyz'
SET @numbers = '23456789'
SET @string = @caps + @lower + @numbers;
WITH pass_cte (the_output)
AS (SELECT Substring(@caps, ( Abs(Checksum(Newid()))%Len(@caps) ) + 1, 1)
UNION ALL
SELECT Substring(@lower, ( Abs(Checksum(Newid()))%Len(@lower) ) + 1, 1)
UNION ALL
SELECT Substring(@lower, ( Abs(Checksum(Newid()))%Len(@lower) ) + 1, 1)
UNION ALL
SELECT Substring(@numbers, ( Abs(Checksum(Newid()))%Len(@numbers) ) + 1
, 1)
UNION ALL
SELECT Substring(@numbers, ( Abs(Checksum(Newid()))%Len(@numbers) ) + 1
, 1)
UNION ALL
SELECT Substring(@string, ( Abs(Checksum(Newid()))%Len(@string) ) + 1,
1)
UNION ALL
SELECT Substring(@string, ( Abs(Checksum(Newid()))%Len(@string) ) + 1,
1)
UNION ALL
SELECT Substring(@string, ( Abs(Checksum(Newid()))%Len(@string) ) + 1,
1)
UNION ALL
SELECT Substring(@string, ( Abs(Checksum(Newid()))%Len(@string) ) + 1,
1)
UNION ALL
SELECT Substring(@string, ( Abs(Checksum(Newid()))%Len(@string) ) + 1,
1)
UNION ALL
SELECT Substring(@string, ( Abs(Checksum(Newid()))%Len(@string) ) + 1,
1)
UNION ALL
SELECT Substring(@string, ( Abs(Checksum(Newid()))%Len(@string) ) + 1,
1))
SELECT TOP 1 (SELECT ( CAST (the_output AS VARCHAR(8000)) )
FROM pass_cte s2
FOR XML PATH('')) AS the_output
FROM pass_cte s1