sql >> データベース >  >> RDS >> Sqlserver

ASCII拡張文字128以降を削除(SQL)

    リンクされたソリューションは、ループを使用しています。これは、可能であれば、避けるべきものです。

    私のソリューションは完全にインライン化可能であり、これからUDF(またはさらに良い:インラインTVF)を作成するのは簡単です。

    アイデア:一連の実行中の数値を作成します(ここでは、sys.objects内のオブジェクトの数によって制限されますが、その場で数値を集計する方法の例はたくさんあります)。 2番目のCTEでは、文字列は1文字に分割されます。最終的な選択は、クリーンな文字列で返されます。

    DECLARE @tbl TABLE(ID INT IDENTITY, EvilString NVARCHAR(100));
    INSERT INTO @tbl(EvilString) VALUES('ËËËËeeeeËËËË'),('ËaËËbËeeeeËËËcË');
    
    WITH RunningNumbers AS
    (
        SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nmbr
        FROM sys.objects
    )
    ,SingleChars AS
    (
        SELECT tbl.ID,rn.Nmbr,SUBSTRING(tbl.EvilString,rn.Nmbr,1) AS Chr
        FROM @tbl AS tbl
        CROSS APPLY (SELECT TOP(LEN(tbl.EvilString)) Nmbr FROM RunningNumbers) AS rn 
    )
    SELECT ID,EvilString
          ,(
            SELECT '' + Chr 
            FROM SingleChars AS sc
            WHERE sc.ID=tbl.ID AND ASCII(Chr)<128
            ORDER BY sc.Nmbr
            FOR XML PATH('')
          ) AS GoodString
    FROM @tbl As tbl
    

    結果

    1   ËËËËeeeeËËËË    eeee
    2   ËaËËbËeeeeËËËcË abeeeec
    

    別の回答があります このアプローチがすべての特別なを置き換えるために使用される私から 安全なの文字 プレーンラテン語を取得する文字




    1. Oracle 11gOFFSETFETCHでエラーが発生する

    2. PHPを使用してSQLデータベースに挿入するときにエラーが発生しました

    3. PHPまたはMySQLを使用してAM/PM時間を24時間形式に変換しますか?

    4. MySQLユーザーが作成した一時テーブルがいっぱいです