Подтвердить что ты не робот

Какой лучший способ идентифицировать скрытые символы в результате запроса в SQL Server (Query Analyzer)?

При попытке идентифицировать ошибочные данные (часто требующие ручной проверки и удаления), мне бы хотелось легко увидеть скрытые символы, такие как TAB, Space, Carriage return и Line feed. Есть ли встроенный способ для этого?

В аналогичном вопросе здесь, в stackoverflow, в отношении Oracle, была предложена функция DUMP (имя поля), но я не знаю, облегчит ли это woud, даже если соответствующая функция будет существовать в 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 Query Analyzer, но в той части интерфейса, которая когда-то была менеджером SQL Enterprise. Щелкните правой кнопкой мыши таблицу в дереве обозревателя объектов SQL Management Studio и выберите "Изменить верхние 200 строк". В результате пустое пространство (по крайней мере, CR LF) видно как пустые квадраты.

4b9b3361

Ответ 1

Создайте функцию, которая обращается ко всем возможным пробелам и включает только те, которые кажутся подходящими:

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

Ответ 2

Чтобы найти их, вы можете использовать этот

;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 позволит вам ЗАМЕНИТЬ их, но вы получите несколько строк... Я не могу придумать, как это сделать...

Ответ 3

Как я это сделал, выбрав все данные

select * from myTable, а затем щелкнув правой кнопкой мыши по набору результатов и выбрав "Сохранить результаты как..." в файле csv.

Открытие файла csv в Notepad ++ Я видел, что символы LF не отображаются в результирующем наборе SQL Server.

Ответ 4

Вы всегда можете использовать функцию DATALENGTH, чтобы определить, есть ли у вас лишние символы пробела в текстовых полях. Это не сделает текст видимым, но покажет вам, где есть лишние символы пробела.

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

Это приведет к 11 для BinaryLength и 10 для TextLength.

В таблице ваш SQL хотел бы:

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

Эта функция доступна во всех версиях SQL Server начиная с 2005 года.

Ответ 5

select myfield, CAST(myfield as varbinary(max)) ...

Ответ 6

Я столкнулся с той же проблемой с символом, который мне никогда не удавалось сопоставить с запросом CHARINDEX, LIKE, REPLACE - CHARINDEX, LIKE, REPLACE и т.д. Не работали. Тогда я использовал решение грубой силы, которое ужасно, тяжело, но работает:

Шаг 1: сделать копию полного набора данных - отследить исходные имена с помощью source_id, ссылающегося на pk исходной таблицы (и сохранить этот идентификатор источника во всех последующих таблицах). Шаг 2: LTRIM RTRIM данные и замените все двойные пробелы, табуляцию и т.д. (В основном все символы CHAR (1) - CHAR (32) на один пробел). Строчные буквы также целиком установите. Шаг 3: замените все специальные символы, которые вы знаете (получить список всех цитат, двойные кавычки и т.д.), то из аз (я предлагаю г). в основном заменить все, что не стандартные английские символы AZ ( с помощью вложенных зАМЕНЫ из REPLACE в цикле). Шаг 4: разделить слово на вторую копию, где каждое слово находится в отдельной строке - разделение - это SUBSTRING основанное на расположении символов пробела - в этот момент мы должны пропустить те, где есть скрытое пространство, которое мы сделали Шаг 5: разбить каждое слово на третью копию, где каждая буква находится в отдельной строке (я знаю, что это очень большая таблица) - отслеживать хариндекс каждой буквы в отдельном столбце. Шаг 6: Выберите в таблице выше все, что не похоже на [az]. Это список неопознанных символов, которые мы хотим исключить е.

Из выходных данных шага 6 у нас достаточно данных, чтобы сделать серию подстрок источника, чтобы выбрать все, кроме неизвестного символа, который мы хотим исключить.

Примечание 1: есть разумные способы оптимизировать это, в зависимости от размера исходного выражения (шаги 4, 5 и 6 могут быть выполнены за один раз).

Примечание 2: это не очень быстро, но самый быстрый способ сделать это для большого набора данных, потому что разбиение строк на слова и слова на буквы производится подстрокой, которая разбивает всю таблицу на куски по одному символу. Тем не менее, это довольно тяжело построить. При меньшем наборе может быть достаточно проанализировать каждую запись одну за другой и найти символ, которого нет в списке всех английских символов плюс все специальные символы.