none
В SQL express 2005 не получается создать упорядоченное представление RRS feed

  • Вопрос

  • Опять глупый вопрос. Наверное что-нибуть делаю не так, но никак не пойму что. Помогите, пожалуйста.

    Имеется небольшая таблица с четырьмя полями, одно из них ключевое idWho (int). Требуется упорядочить по текстовому полю NameWho.

    В Microsoft SQL Server Management Studio Express 9.00.4035.00 создаю представление из одной таблицы. Представление содержит все поля исходной таблица.

    В строке таблицы представления , соответсвующей полю NameWho, ставлю Sort tipe Ascending, Sort order =1.

    Высвечивается следущий запрос:

    SELECT     TOP (100) PERCENT IdWho, NameWho, InfoWho
    FROM         dbo.Who
    ORDER BY NameWho

    на мой взгляд все правильно. Закрываю режим дизайна, нажимаю Open View и вижу неупорядоченную таблицу и полное отсутствие мыслей, что можно и должно сделать


    • Изменено Miklv 18 июля 2012 г. 11:15
    18 июля 2012 г. 11:14

Ответы

  • ORDER BY NameWho в определении view не задает порядок возвращаемых при выборке данных. Этот ORDER BY используется только для определения строк, попадающих под TOP. 

    Т.е. если в определении view будет что-то вроде SELECT TOP (50) PERCENT ... ORDER BY NameWho, то выборка из view вернет бы половину людей, с "меньшими" именами. Но записи все равно будут отсортированы в случайном порядке. Т.е. на данных вроде "b, c, d, a" результат был бы "b, a" или "a, b" (какой именно - неизвестно).

    Задавайте порядок выборки в коде, который делает непосредственный SELECT из view или из таблицы.


    • Изменено PashaPashModerator 18 июля 2012 г. 16:49
    • Помечено в качестве ответа Miklv 18 июля 2012 г. 17:03
    18 июля 2012 г. 16:48
    Модератор
  • Не уверен насчет Майкла Гандерлоя, но есть явное упоминание про случайный порядок возвращаемых строк в документации по ORDER BY Clause, в разделе Limitations and Restrictions: The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself.

    И есть статья в KB: http://support.microsoft.com/kb/926292, в которой явно написано что это поведение by design, но что когда-то в 2000-ом SQL Server строки из view c orderby возвращались с учетом сортировки. Поэтому можно хотфиксом и настройками временно вернуть старое поведение. Возможно, авторы книги не успели переписать главу под новый на тот момент SQL Server 2005.

    • Помечено в качестве ответа Abolmasov Dmitry 25 июля 2012 г. 7:45
    18 июля 2012 г. 18:50
    Модератор

Все ответы

  • Попробуй

    SELECT IdWho, NameWho, InfoWho
    FROM dbo.Who
    ORDER BY NameWho

    18 июля 2012 г. 11:42
    Модератор
  • во view order by работает по другому, если вы используете top и order by то внутри view происходит сортировка и результат может выдаеться в случайном порядке

    почитайте об этом http://msdn.microsoft.com/en-us/library/ms187956.aspx
    • Изменено Brash_O 18 июля 2012 г. 11:57
    18 июля 2012 г. 11:54
  • Большое спасибо. Но у меня не получается сделать эти изменения. Если я редактирую запрос в режиме дизайн, то при закрытии он не сохраняется.

    Если я редактирую в режиме Edit, то измененя сохранаяется как файл проект. Если я пытаюсь запустить отредактированый в Edit запрос, то он находит в нем ошибку:

    "Предложение ORDER BY не допускается в представлениях, встроенных функциях, производных таблицах, вложенных запросах и обобщенных табличных выражениях, если не указано TOP или FOR XML."

    Подскажите, пожалуйста, что я делаю не так?

    18 июля 2012 г. 16:29
  • ORDER BY NameWho в определении view не задает порядок возвращаемых при выборке данных. Этот ORDER BY используется только для определения строк, попадающих под TOP. 

    Т.е. если в определении view будет что-то вроде SELECT TOP (50) PERCENT ... ORDER BY NameWho, то выборка из view вернет бы половину людей, с "меньшими" именами. Но записи все равно будут отсортированы в случайном порядке. Т.е. на данных вроде "b, c, d, a" результат был бы "b, a" или "a, b" (какой именно - неизвестно).

    Задавайте порядок выборки в коде, который делает непосредственный SELECT из view или из таблицы.


    • Изменено PashaPashModerator 18 июля 2012 г. 16:49
    • Помечено в качестве ответа Miklv 18 июля 2012 г. 17:03
    18 июля 2012 г. 16:48
    Модератор
  • Большое спасибо! Вот и верь после этого книгам! В книге Майкл Гандерлой и др "SQL Server 2005" на 426 странице говорят, что для упорядочивания представлений надо вставлять Order by.
    • Изменено Miklv 18 июля 2012 г. 17:07
    18 июля 2012 г. 17:03
  • Не уверен насчет Майкла Гандерлоя, но есть явное упоминание про случайный порядок возвращаемых строк в документации по ORDER BY Clause, в разделе Limitations and Restrictions: The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself.

    И есть статья в KB: http://support.microsoft.com/kb/926292, в которой явно написано что это поведение by design, но что когда-то в 2000-ом SQL Server строки из view c orderby возвращались с учетом сортировки. Поэтому можно хотфиксом и настройками временно вернуть старое поведение. Возможно, авторы книги не успели переписать главу под новый на тот момент SQL Server 2005.

    • Помечено в качестве ответа Abolmasov Dmitry 25 июля 2012 г. 7:45
    18 июля 2012 г. 18:50
    Модератор