ВЫБЕРИТЕ * не возвращающий все ряды, если я id ORDER BY DESC

Применение, которому предоставляют "Последовательность, Содержит больше чем Одно Предприятие" ошибка. Знание этого обычно является результатом.SingleOrDefault() команда в Linq, я начал заниматься расследованиями. Я могу проверить, что у рабочего сервера есть много случаев двойных ключевых слов, таким образом, это - то, где я начинаю.

У меня есть следующий стол Ключевого слова:

  • идентификационный INT (NOT NULL, PRIMARY KEY)
  • текст NVARCHAR (512)
  • активный INT

активный просто способ "позволить/отключить" данные, если потребность ударяет меня. Я использую LINQ для SQL и осуществил следующий метод:

public Keyword GetKeyword(String keywordText)
{
    return db.Keywords.SingleOrDefault(k => (k.text.ToUpper() == keywordText.ToUpper()));
}

Идея состоит в том, что я прилагаю ключевые слова через таблицу ассоциации так, чтобы многократные объекты могли сослаться на то же самое ключевое слово. В столе Ключевого слова не должно быть никаких двойных вводов текста. Это не проведено в жизнь на базе данных, а скорее через код. Это не могло бы быть наиболее успешной практикой, но это - наименьшее количество моих проблем в данный момент. Таким образом, когда я создаю свой объект, я делаю это:

Keyword keyword = GetKeyword(keywordText)
if(keyword == null)
{
    keyword = new Keyword();
    keyword.text = keywordText;
    keyword.active = Globals.ACTIVE;
    db.Keywords.InsertOnSubmit(keyword);
}
KeywordReference reference = new KeywordReference();
reference.keywordId = keyword.id;
myObject.KeywordReferences.Add(reference);
db.SubmitChanges();

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

Таким образом, я запускаю несколько тестов и ручных запросов на моей испытательной базе данных и нахожу, что ключевое слово, которое я передал в своих тестах, не находится в базе данных, еще если я делаю СОЕДИНЕНИЕ, я вижу, что это. Таким образом, я рою немного глубже и решил вручную просмотреть через целый список:

SELECT * FROM Keyword

возвратите 737 результатов. Я решил, что не хотел просматривать их всех, таким образом, я текст ORDER BY и получаю 737 результатов. Я ищу слово, которое я недавно добавил, и оно не обнаруживается в списке.

Запутанный, я делаю поиск для всего keywordIds, связанного с объектом, я недавно продолжил работать, и посмотрите некоторых с идами более чем 1,000 (id собирается автоувеличить 1). Зная, что я никогда на самом деле удаляю ключевое слово (следовательно "Активная" колонка) так все иды от 1 до, по крайней мере, тех чисел, более чем 1,000 должны все присутствовать, я делаю другой вопрос:

SELECT * FROM Keyword ORDER BY id

прибыль 737 результатов, макс. ID останавливается в 737. Таким образом, я пробую:

SELECT * FROM Keyword ORDER BY id DESC

прибыль 1308 рядов

Я видел различия как это прежде, если нет никакого первичного ключа или никакого уникального идентификатора, но я подтвердил, что идентификационная колонка - на самом деле, оба. Я не действительно уверен, куда пойти отсюда, и у меня теперь есть дополнительная проблема приблизительно 4,000 + ключевые слова на производстве, которые являются двойными, и еще несколько объектов что ссылка различные случаи каждого.

5
nl ja de
@500 - Внутренняя Ошибка Сервера. Это возможно. Я сделал ВСТАВКУ в новый стол, используя ИЗБРАННОЕ * id ORDER BY DESC и могу теперь подвергнуть сомнению новый стол как ожидалось.
добавлено автор AceCorban, источник
@HABO. Я получаю ошибку: заявление закончено. Максимальная рекурсия 100 была исчерпана перед завершением заявления.
добавлено автор AceCorban, источник
@CSharper да, я могу заставить взгляд на все ссылки дублировать записи. Есть только один стол, что справочное Ключевое слово, это - многие многим таблица ассоциации с центральным столом. У этой таблицы ассоциации есть ссылки, чтобы дублировать Ключевые слова где-нибудь в 4,000 с на производстве, таким образом, я won' t быть в состоянии сделать это по частям. I' m принятие петли посредством ОБНОВЛЕНИЯ, ГДЕ В (ИЗБРАННОМ) типе процедура получит меня большая часть пути там, тогда я мог, вероятно, просто удалить любое Ключевое слово, у которого нет ссылок. I' ll видят то, что я могу придумать. Спасибо.
добавлено автор AceCorban, источник
@HABO я получаю 92 результата: каждое число от 738 до 829. Так как у меня нет кода, который на самом деле удаляет из базы данных, это странное.
добавлено автор AceCorban, источник
Наша самая большая проблема состоит в том, что у нас есть отсутствие достаточного таланта. Мы на самом деле не имеем никакого DBA и ограничиваемся моей способностью управлять SQL Server, который, по меньшей мере, не является моим лучшим талантом и еще больше осложнен тем, что у меня нет прямого доступа к коробке. Политика, однако, не может быть изменена, потому что это - правительственная операция и I' m просто непритязательный подрядчик. Я буду проводить некоторое исследование в ваши предложения и видеть то, что я могу сделать. Тем временем я думаю, что вы все дали мне достаточно, чтобы думать о. Как я отмечаю эту тему как "Решенная" или "Закрытая"?
добавлено автор AceCorban, источник
Ах, право, которое имеет смысл. Так есть ли какое-либо объяснение относительно того, почему такая вещь могла бы заставить стол думать, что есть меньше рядов, чем есть, и почему id ORDER BY изменения DESC это? Как я упомянул ранее, я смог составить новую таблицу и вставить все ряды в новый стол, и я в состоянии подвергнуть сомнению новый стол очень хорошо.
добавлено автор AceCorban, источник
@Galdur I' m использование MS SQL Server 2008 R2. I' m вполне уверенный вы и 500 правы, что мы просто смотрим на коррумпированный стол, так как я смог составить новую таблицу, используя ИЗБРАННЫЙ id ORDER BY DESC от старого стола и подвергнуть сомнению его. Этот doesn' t действительно решают проблему на производстве, так как ущерб был нанесен, но в настоящее время, я заменил случай.SingleOrDefault к.FirstOrDefault, чтобы, по крайней мере, остановить ошибки. Теперь я должен выяснить, как изменить все различные ссылки на дубликаты и удалить дубликаты. И I' m, вероятно, 6/10 в таланте SQL.
добавлено автор AceCorban, источник
@HABO that' s положительная сторона, я проверял id МАКСА, смотря на первый вход, когда я заказал id DESC. ИЗБРАННЫЙ ГРАФ() вопрос уступает 737 на самом деле.
добавлено автор AceCorban, источник
Говорите со своим DBA и сделайте, чтобы они начали бежать, регулярно намечаемая коррупция сверяется с DBCC и т.д.
добавлено автор RBarryYoung, источник
Делает это возвращение вопроса любые ряды: объявляет @Max как Интервал = (выберите Макса (Айдахо) из Ключевого слова); с Числами как (выбирают 1 как союз Числа все избранное Число + 1 от Чисел, где Число <@Max) выбирают Число из Чисел как N оставленный Ключевое слово внешнего объединения как K на K.Id = N.Number, где K.Id ПУСТОЙ
добавлено автор HABO, источник
@AceCorban - Вы на самом деле подвергали сомнению количество, например, избранный граф (42) от (выберите лучшие 100 Id процента из заказа Ключевого слова Id desc) как Туз , (или @@ROWCOUNT или количество возвращенных рядов), или вы просто смотрели на самое большое Id ?
добавлено автор HABO, источник
@AceCorban - Это isn' t странный, если вставки потерпели неудачу или сделки были понижены до прежнего уровня.
добавлено автор HABO, источник
Дополнение maxrecursion выбор меры вопрос: объявляет @Max как Интервал = (выберите Макса (Айдахо) из Ключевого слова); с Числами как (выбирают 1 как союз Числа все избранное Число + 1 от Чисел, где Число <@Max) выбирают Число из Чисел как N оставленный Ключевое слово внешнего объединения как K на K.Id = N.Number, где K.Id - ПУСТОЙ выбор (maxrecursion 0) Управление, это на оригинальном столе показало бы любые промежутки в Id ценности.
добавлено автор HABO, источник
FWIW, это звучит много мне как коррумпированный стол или индекс.
добавлено автор 500 - Internal Server Error, источник
У вас есть внешние ключи к вашему столу, таким образом, можно определить таблицы ссылки и колонки? Можно попытаться добраться, снимки различного выбирает, и создайте заявление обновления для всех столов ссылки, используя те другие наборы строк.
добавлено автор CSharper, источник
Другая вещь: Это имеет значение для сценария ремонта, если кластерный индекс содержит большой набор результатов, и несгруппированные индексы только содержат подмножества или наоборот.
добавлено автор CSharper, источник
Определяя á n заказ вами может затронуть индекс, привыкший Инженером SQL к ' идите down' список строк кандидата. В этом случае Id - колонка первичного ключа, поэтому план запросов игнорирует вспомогательный индекс и подходит прямо к столу. Какую базу данных вы используете? I' ve, замеченный этот вид поведения с коррумпированной базой данных в Доступе MS.
добавлено автор Galdur, источник
Начните с dbcc checkdb на базе данных. Я думаю, что индекс коррумпирован, но что стол в порядке.
добавлено автор Galdur, источник

1 ответы

Если так или иначе можно получить все данные тогда стол прекрасен, но индекс испорчен.

Попытайтесь восстановить индекс на своем столе:

ALTER INDEX ALL ON Your.Table
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);

В редких ситуациях вы видите такие ошибки, если ваш жесткий диск не пишет данные из-за потерь мощности. Chkdsk должен помочь

1
добавлено
Спасибо. I' ve удалось восстановить стол на производстве из резервной копии, но I' ll сохраняют этот вопрос удобным, чтобы попробовать в будущем. Проблема со столом теперь - ущерб, который был нанесен. Дубликаты были введены, когда применение не могло найти ключевые слова по имени, даже при том, что они были там. Это теперь остается проблемой, хотя не технически часть этого вопроса.
добавлено автор AceCorban, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)