Конвертировать VARBINARY в Int или BigInt - PullRequest
0 голосов
/ 05 июня 2018

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

В моей прежней таблице нет первичного ключа для выполнения Delta load.Поэтому я пытаюсь использовать концепцию хеширования для создания уникального ключа.Так как "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_'. Дублирующее значение ключа равно (0x00001195764c40525bcaf6baa9220867).

Однако, когда я проверил наличие дубликата ключа из таблицы.Таблица не имеет дубликат ключа.Тогда почему эта ошибка появляется?

Обратите внимание, что первый раз выполнения служб SSIS работал нормально.Тем не менее, он показывает ошибку во время 2-го выполнения [во время « поиска соответствия вывода »].

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

1 Ответ

0 голосов
/ 05 июня 2018

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

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

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

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

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

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

...