Не удается устранить ошибку конфликта сопоставления с помощью временной таблицы - PullRequest
2 голосов
/ 27 июня 2019

Я пытаюсь перечислить количество пропущенных записей в БД, , как описано в моем оставленном без ответа вопросе здесь

Я сейчас пытаюсь заполнить временную таблицу данными, которые должны бытьпроверил и сравнил это с данными в БД.Мой запрос выглядит следующим образом:

create table #Temp
(
    Component nvarchar(50),
    AssetType nvarchar(50)
)

Insert Into #Temp (Component, AssetType) VALUES
  ('0990.LB00.000.06', '0738.D100.M00.60_03.03'),
  ('0738.D100.L00.55', '9211.D108.D07.01_02.02');


WITH DBD AS (
            Select distinct C.Code Comp, AT.Code AssetType From astComponents C
            Join astAssetTypes AT ON AT.Id = C.AssetTypeId
            Where (C.Code = '0990.LB00.000.06' And AT.Code = '0738.D100.M00.60_03.03') OR (C.Code = '0738.D100.L00.55' And AT.Code = '9211.D108.D07.01_02.02')
            ),
     Compare AS 
            (
            Select T.* FROM #Temp T
            Left Join DBD ON DBD.Comp = T.Component AND DBD.AssetType = T.AssetType
            Where DBD.Comp is null
            )

Select * From Compare

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

Component             Asset Type
0990.LB00.000.06      0738.D100.M00.60_03.03

Однако я представлен сошибка

Сообщение 468, уровень 16, состояние 9, строка 22 * ​​1014 * Невозможно разрешить конфликт сопоставления между «SQL_Latin1_General_CP1_CI_AS» и «Latin1_General_BIN» в операции, равной операции.

1 Ответ

2 голосов
/ 27 июня 2019

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

CREATE TABLE #StringLatin (
    String VARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS)

CREATE TABLE #StringBIN (
    String VARCHAR(100) COLLATE Latin1_General_BIN)

SELECT
    'Oops!!!'
FROM
    #StringLatin AS L
    INNER JOIN #StringBIN AS B ON L.String = B.String

Msg 468, Уровень 16, Состояние 9, Линия5 Не удается разрешить конфликт сопоставления между «Latin1_General_BIN» и «SQL_Latin1_General_CP1_CI_AS» в операции «равно».

Проблема здесь заключается в L.String = B.String, поскольку оба были созданы с разными типами сопоставления.

Вы можете решить эту проблему, изменив параметры сортировки в операторе создания таблицы (так, чтобы он совпадал с тем, к которому вы присоединяетесь позже) или непосредственно при сравнении внутри SELECT.

SELECT
    'Works'
FROM
    #StringLatin AS L
    INNER JOIN #StringBIN AS B ON L.String = B.String COLLATE SQL_Latin1_General_CP1_CI_AS

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

SELECT SERVERPROPERTY('collation');
...