Преобразование VARBINARY в Int или BigInt

Мой вопрос очень прост, и я понимаю, что дизайн БД старых дней не так хорош, как мы считаем в наши дни.

В моей устаревшей таблице нет первичного ключа для выполнения дельта-загрузки. Следовательно, я пытаюсь использовать концепцию хеширования для создания уникального ключа. Поскольку «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 работал нормально. Однако он показывает ошибку во время второго выполнения [во время "вывод совпадения поиска"].

Пожалуйста помоги. Спасибо.


person AskMe    schedule 05.06.2018    source источник
comment
С INT вероятность коллизий существенна — даже несколько десятков тысяч строк будут иметь высокую вероятность коллизии. Даже BIGINT быстро выйдет из строя, если в вашей таблице миллионы строк. Есть ли какая-то причина, по которой вы не можете просто использовать идентификатор int/bigint для первичного ключа (если у вас должен быть ключ) и использовать индекс для полного хеш-значения, чтобы проверить, присутствует ли ваша строка?   -  person Jeroen Mostert    schedule 05.06.2018
comment
Почему вы не можете использовать varbinary(100) в качестве ПК?   -  person Dan Guzman    schedule 05.06.2018
comment
Скорее всего, второе выполнение завершится ошибкой, потому что строка, которую вы пытаетесь импортировать, уже существует. Дважды проверьте, как вы заставляете службы SSIS исключать уже существующие строки. В службах SSIS есть собственные правила сравнения значений, которые не обязательно совпадают со значениями SQL Server. Также обратите внимание, что вы должны вставлять строки, которые не соответствуют результатам поиска (т. е. не присутствуют), поэтому убедитесь, что вы подключили правильные выходные данные справа. входы.   -  person Jeroen Mostert    schedule 05.06.2018


Ответы (1)


В проектах, над которыми я работал раньше, мы всегда использовали идентификаторы GUID в качестве первичных ключей, используя уникальный тип идентификатора в SQL Server.

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

Создать столбец: guid, uniqueidentifier, nonnull, значение по умолчанию, newsequentialid(), PK
Создать столбец: id, bigint, nonnull, identity(1,1)

Создайте некластеризованный индекс для столбца guid, уникальный
Создайте кластеризованный индекс для столбца id, уникальный

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

Если вам нужна некоторая форма ссылки между старой базой данных и новой, и вы МОЖЕТЕ изменить структуру старой базы данных, вы можете создать в ней столбец uniqueidentifier (или char (36), если он не поддерживает uniqueidentifier) ​​и назначить guid для каждого из них, а ЗАТЕМ создайте дополнительный столбец uniqueidentifier в новой базе данных, чтобы у вас была эта ссылка, и вставьте в нее это значение. Если это имеет смысл.

person Will Jones    schedule 05.06.2018