web-dev-qa-db-ja.com

SQL Server(クエリアナライザー)のクエリの結果で非表示の文字を識別するための最良の方法は何ですか?

誤ったデータ(多くの場合、手動での確認と削除が必要)を識別しようとすると、TAB、スペース、キャリッジリターン、ラインフィードなどの隠された文字を簡単に確認できる方法が欲しいです。これには組み込みの方法がありますか?

ここでのstackoverflowに関する同様の質問では、Oracleに関してDUMP(フィールド名)関数が提案されましたが、対応する関数がSQL Serverに存在する場合でも文字列を表示する必要があるため、その混乱が物事を容易にするかどうかはわかりませんコンテキストで。

私が思いついた最高のアイデアは、次のように、予想される隠されたキャラクターを目に見えるキャラクターに置き換えることでした:

SELECT REPLACE(REPLACE(REPLACE(REPLACE(myfield, ' ', '˙'), CHAR(13), '[CR]'), CHAR(10), '[LF]'), CHAR(9), '[TAB]') FROM mytable

もっと良い方法はありますか?私が考慮していない他のあまり一般的でない隠し文字があるかもしれないので、私はこの方法が好きではありません。例えば、垂直TABなど。ほとんどのテキストエディタでできるように、「隠し文字を表示」 SQL Server Query Analyzerのこのような素晴らしい機能なので、SQLサーバーでも何らかの方法で実行できるとほとんど期待しています...または少なくとも、この種の空白を表示するために誰かが私のものよりも良いアイデアを持っていること情報。

SQLクエリアナライザではなく、かつてSQL Enterpriseマネージャであったインターフェイスの一部に「空白」を表示する組み込みの方法があることに気付きました。SQLのテーブルを右クリックします。 Management Studioオブジェクトエクスプローラーツリーで、[上位200行の編集]を選択します。結果では、空白(少なくともCR LF)が空の四角形として表示されます。

33
Andreas Jansson

すべてのホワイトスペースの可能性に対処する関数を作成し、適切と思われるもののみを有効にします。

SELECT dbo.ShowWhiteSpace(myfield) from mytable

テストするホワイトスペースケースのみのコメントを外します。


CREATE FUNCTION dbo.ShowWhiteSpace (@str varchar(8000))
RETURNS varchar(8000)
AS
BEGIN
     DECLARE @ShowWhiteSpace varchar(8000);
     SET @ShowWhiteSpace = @str
     SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(32), '[?]')
     SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(13), '[CR]')
     SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(10), '[LF]')
     SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(9),  '[TAB]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(1),  '[SOH]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(2),  '[STX]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(3),  '[ETX]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(4),  '[EOT]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(5),  '[ENQ]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(6),  '[ACK]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(7),  '[BEL]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(8),  '[BS]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(11), '[VT]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(12), '[FF]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(14), '[SO]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(15), '[SI]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(16), '[DLE]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(17), '[DC1]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(18), '[DC2]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(19), '[DC3]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(20), '[DC4]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(21), '[NAK]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(22), '[SYN]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(23), '[ETB]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(24), '[CAN]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(25), '[EM]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(26), '[SUB]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(27), '[ESC]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(28), '[FS]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(29), '[GS]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(30), '[RS]')
--   SET @ShowWhiteSpace = REPLACE( @ShowWhiteSpace, CHAR(31), '[US]')
     RETURN(@ShowWhiteSpace)
END

それらを見つけるには、これを使用できます

;WITH cte AS
(
   SELECT 0 AS CharCode
   UNION ALL
   SELECT CharCode + 1 FROM cte WHERE CharCode <31
)
SELECT
   *
FROM
   mytable T
     cross join cte
WHERE
   EXISTS (SELECT *
        FROM mytable Tx
        WHERE Tx.PKCol = T.PKCol
             AND
              Tx.MyField LIKE '%' + CHAR(cte.CharCode) + '%'
         )

EXISTSをJOINに置き換えると、それらを置き換えることができますが、複数の行が表示されます...それを回避する方法は考えられません...

9
gbn

私がやった方法は、すべてのデータを選択することでした

select * from myTableその後、結果セットを右クリックして、csvファイルの[名前を付けて保存...]を選択します。

Notepad ++でcsvファイルを開くと、SQL Serverの結果セットにLF文字が表示されません。

8
erik

常にDATALENGTH関数を使用して、テキストフィールドに余分な空白文字があるかどうかを判断できます。これにより、テキストは表示されませんが、余分な空白文字がある場所が表示されます。

    SELECT DATALENGTH('MyTextData ') AS BinaryLength, LEN('MyTextData ') AS TextLength

これにより、BinaryLengthの場合は11、TextLengthの場合は10が生成されます。

テーブルでは、SQLは次のようにします。

    SELECT * 
    FROM tblA
    WHERE DATALENGTH(MyTextField) > LEN(MyTextField)

この関数は、2005年以降のすべてのバージョンのSQL Serverで使用できます。

5
Don Kidd
select myfield, CAST(myfield as varbinary(max)) ...
0
Oleg Dok

Whereクエリと一致することができなかった文字で同じ問題に直面しました-CHARINDEX, LIKE, REPLACEなどが機能しませんでした。それから、私はひどく重いが、うまくいくブルートフォースソリューションを使用しました。

ステップ1:完全なデータセットのコピーを作成します-ソーステーブルのpkを参照するsource_idで元の名前を追跡します(これを保持します後続のすべてのテーブルのソースID)。 ステップ2LTRIM RTRIMデータ、すべての二重スペース、タブなど(基本的にすべてのCHAR(1)〜CHAR(32)を1つのスペースに置き換えます。セット全体も小文字にします。ステップ3:知っているすべての特殊文字(すべての引用符、二重引用符などのリストを取得)をazからの何かに置き換えます(zをお勧めします)。 azによる文字(ループ内のREPLACEのネストされたREPLACEを使用)ステップ4:Wordによって2番目のコピーに分割されます。行-分割はスペース文字の位置に基づいたSUBSTRINGです-この時点で、以前にキャッチしなかった隠されたスペースがある場所を見逃すはずですステップ5:各Wordを3番目のコピーに分割します。各文字は別々の行にあります(非常に大きなテーブルになることは知っています)-各文字のcharindexを追跡します別の列ステップ6:上記の表でLIKE [az]以外のすべてを選択します。除外したい正体不明の文字のリスト。

ステップ6の出力から、ソースの一連の部分文字列を作成して、除外する不明な文字以外のすべてを選択するのに十分なデータが得られます。

注1:元の式のサイズに応じて、これを最適化するスマートな方法があります(ステップ4、5、6は一度に実行できます) )。

注2:これは非常に高速ではありませんが、行を単語と単語に分割するため、大規模なデータセットでこれを行う最も速い方法です文字へのサブストリングは、すべてのテーブルを1つの文字スライスにスライスします。ただし、これは構築するのが非常に重いです。より小さなセットでは、各レコードを1つずつ解析し、すべての英語文字とすべての特殊文字のリストにない文字を検索するだけで十分な場合があります。

0
JeromeE