Мой вопрос очень прост, и я понимаю, что дизайн БД старых дней не так хорош, как мы считаем в наши дни.
В моей устаревшей таблице нет первичного ключа для выполнения дельта-загрузки. Следовательно, я пытаюсь использовать концепцию хеширования для создания уникального ключа. Поскольку «HASHBYTES» возвращает VarBinary, и я не могу использовать тип VarBinary в качестве первичного ключа (не уверен в этом)
URL-адрес ссылки в MSDN: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/94231bb4-ccab-4626-a9fb-325264bb883f/can-varbinary700-column-be-used-as-primary-key?forum=transactsql
следовательно, я конвертирую это в INT или BigInt. Проблема в том, что он дает как отрицательное, так и положительное значение (из-за диапазона).
Мой вопрос: как я могу преобразовать тип VARBINARY (100) в целое число или BigInt (значение + ve) и установить его в качестве первичного ключа в одной из моих таблиц?
Редактировать примечание:
Я попытался использовать VARBINARY в качестве первичного ключа для дельта-загрузки в задаче поиска служб SSIS. Я получил ошибку:
"Нарушение ограничения PRIMARY KEY" PK__DMIN__607056C02FB7E7DE. Невозможно вставить повторяющийся ключ в объект "dbo.DMIN_".
Однако, когда я проверил дублирующийся ключ из таблицы. В таблице нет повторяющихся ключей. Тогда почему эта ошибка появляется?
Обратите внимание, что первый раз запуск SSIS работал нормально. Однако он показывает ошибку во время второго выполнения [во время "вывод совпадения поиска"].
Пожалуйста помоги. Спасибо.
INT
вероятность коллизий существенна — даже несколько десятков тысяч строк будут иметь высокую вероятность коллизии. ДажеBIGINT
быстро выйдет из строя, если в вашей таблице миллионы строк. Есть ли какая-то причина, по которой вы не можете просто использовать идентификатор int/bigint для первичного ключа (если у вас должен быть ключ) и использовать индекс для полного хеш-значения, чтобы проверить, присутствует ли ваша строка? - person Jeroen Mostert   schedule 05.06.2018