Строковое значение не распознается оператором select, передающим идентичное строковое значение - PullRequest
0 голосов
/ 23 января 2020

Я борюсь с извлечением данных, используя запрос ниже.

Эта проблема возникает для всех строковых значений в этом столбце. Даже если я скопирую фактическое значение в SSMS из этой таблицы и вставлю его в оператор выбора (where string = 'MyStringVlaue'). Функции LTRIM / RTRIM также не помогли.

Некоторая информация:

Тип данных столбца источника таблицы базы данных - VARCHAR(500).

Уровень совместимости моей базы данных - 130. Использование SSMS 2016. Моя база данных Collation - SQL_Latin1_General_CP1_CI_AS, а моя строка Collation Collation - SQL_Latin1_General_CP1_CI_AS

Но это не создает никаких проблем при запросе тех же строковых значений, которые были изначально скопированы из проблемной таблицы c в другие таблицы .

Таблица проблемных c была импортирована с помощью SQL Мастер импорта сервера из файла Excel, распознаваемого мастером как тип 2007-2010.

drop table #T
select 'MyStringVlaue' as String into #t
select * from #t where String ='MyStringVlaue' -- this does not return anything when executed on the Real table!
select * from #t 

- пример

select ASCII('MEDICAL SERVICES DISTRICT') -- output is 65

- PS

Я создал копию таблицы проблемных c, запустив select * into from originalSourceTable По-прежнему та же проблема.

Ответы [ 3 ]

0 голосов
/ 23 января 2020

Скорее всего, в значениях вашей базы данных есть "невидимые" символы, обычным виновником является трейлинг новых символов строки, но это может быть что угодно, например, табуляция, вертикальная табуляция, возвраты и т. Д. c.

Вывод шестнадцатеричное значение несовпадающих значений, например:

SELECT
    CAST(myStringColumn AS VARBINARY(4)),
    CAST('MEDICAL SERVICES DISTRICT' AS VARBINARY(4))
FROM mytable
WHERE myStringColumn like '%MEDICAL SERVICES DISTRICT%'
AND myStringColumn <> 'MEDICAL SERVICES DISTRICT' 

Вероятно, вы выясните проблему путем проверки.

Если у вас есть строки в кодировке Юникод, используйте VARBINARY(8) вместо VARBINARY(4).

0 голосов
/ 23 января 2020

Сначала строковое значение не имеет параметров сортировки. Демонстрация:

DECLARE @STRING VARCHAR(32) COLLATE French_CI_AI;

Сбой.

Во-вторых, когда вы создаете временную таблицу (#), сопоставление является сопоставлением tempdb. И это сопоставление может отличаться от сопоставления контекстной базы данных.

В-третьих, существует множество решений:

1) сопоставление с контекстной БД по умолчанию:

select 'MyStringVlaue' COLLATE database_default as String into #t

2) сопоставление с указанием c one:

select 'MyStringVlaue' COLLATE SQL_Latin1_General_CP1_CI_AS as String into #t

3) автоматическое сопоставление с контекстной базой данных по умолчанию:

, если база данных частично содержится…

0 голосов
/ 23 января 2020

TENTATIVE SOLUTION: Возможно, это ошибка самой SSMS. После того, как я открыл новое окно редактора запросов и набрал вручную тот же оператор выбора, проблема исчезла. Хотя обратите внимание, что я скопировал и вставил код из старого окна редактора запросов SSMS, проблема все еще сохраняется. Помогло только когда я набираю код вручную с нуля.

...