文字列を英数字のみに変換する関数が必要です...
意味は、標準の 26 文字と 10 個の数字以外のすべての文字を何もない/空白に置き換える (空にする) ことです。すべてのスペースをハイフンに置き換えます。例は次のようになります。
から
stack## overfl*w's s"te !s cool!
に
stack-overflws-ste-s-cool
助言がありますか?
文字列を英数字のみに変換する関数が必要です...
意味は、標準の 26 文字と 10 個の数字以外のすべての文字を何もない/空白に置き換える (空にする) ことです。すべてのスペースをハイフンに置き換えます。例は次のようになります。
から
stack## overfl*w's s"te !s cool!
に
stack-overflws-ste-s-cool
助言がありますか?
CREATE FUNCTION dbo.StripNonAlphaNumerics
(
@s VARCHAR(255)
)
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @p INT = 1, @n VARCHAR(255) = '', @c CHAR(1);
SET @s = REPLACE(@s, ' ', '-');
WHILE @p <= LEN(@s)
BEGIN
SET @c = SUBSTRING(@s, @p, 1);
IF @c = '-' OR @c LIKE '[A-Za-z0-9]'
BEGIN
SET @n += @c;
END
SET @p += 1;
END
RETURN(@n);
END
GO
使用法:
SELECT dbo.StripNonAlphaNumerics('tether-45(;$&@- ip');
結果:
tether-45--ip
これには「XML連結トリック」を使用できます。1 から最長の入力文字列の長さまでの整数のテーブルが必要です。
-- The table Nums should have a column "n" with
-- integers from 1 to N, where N is at least as long as
-- the longest input string.
declare @T table (
id int,
s varchar(40)
);
insert into @T values
(1,'This *9--St ring.. '),
(2,'@#_that*8.3a--String..')
select
id,
(
select case when substring(s,n,1) = space(1) then '-' else substring(s,n,1) end
from Nums
where substring(s,n,1) like '[ a-zA-Z0-9]'
and n between 1 and datalength(s)
order by n
for xml path('')
) as S
from @T
Result:
id S
1 This-9St-ring-
2 that83aString
元の文字列の各文字を連続した整数のテーブルに結合する「文字ウォーカー」の概念を採用できます。この例では、最大長を 80 に制限していますが、もちろん整数テーブルを必要なだけ大きくすることもできます。
declare @c table (i int);
declare @i int=1;
while @i<80 begin
insert into @c values(@i);
set @i+=1;
end
declare @str varchar(80)='stack## overfl*w''s s"te !s cool!';
declare @newstr varchar(80)='';
select @newstr+=replace(substring(@str,i,1),' ','-')
from @c
where substring(@str,i,1) like '[A-Za-z0-9 ]';
select @newstr;
結果:
stack-overflws-ste-s-cool
パフォーマンスに関する注意: このメソッドは、変換プロジェクトのレガシー データから不正な文字を消去するために、私が作業中の関数で使用するものです。その設定では、整数テーブルが事前に作成され、関数によって呼び出されます。整数テーブルのi int
列には、PK も定義されています。パフォーマンスは非常に高速です。