2016-05-13 7 views
2

У меня есть следующие данные в моей БД:Нарушение первичного ключа, когда значения не совпадают

enter image description here

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

var tagList = new List<ProductTag> { new ProductTag { Name = "diepvries" } }; 
var sbCopy = new SqlBulkCopy(_dataContext.Database.Connection.ConnectionString) { BulkCopyTimeout = 60 * 10 }; 
sbCopy.WriteToServer(tagList.AsDataReader()); 

Однако следующее исключение

Нарушение ограничения первичного ключа «PK_dbo.ProductTags». Не может вставить дубликат ключа в объект 'dbo.ProductTags'. Дубликат ключа Значение (diepvries).

Я также тестировал текст «diepvries2», и он работал. Что я делаю не так?

ответ

6

Согласно this page,

«SQL Server следует ANSI/ISO SQL-92 спецификации (раздел 8.2, < Сравнение Predicate >, Общие правила # 3) о том, как сравнивать строки с пробелами. стандарт ANSI требует отступы для символа строки, используемые в сравнениях, так что их длины совпадают до их сравнения. "

+1

Чтобы добавить небольшой контекст с вашей текущей ситуацией. «Diepvries» равен «Diepvries» –

2

Что такое БД? Я знаю, что на SQL-сервере строки «дополняются» пробелами до одинаковой длины перед сравнением. Таким образом, ваши две строки идентичны по отношению к базе данных SQL. Деталь here.