Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
шапоклякистка 8-го дня
 Аватар для texnik-san
3681 / 2241 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1

Хранимая процедура или табличная функция?

28.08.2016, 12:37. Показов 4344. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если мне нужно получить упорядоченую выборку, зависящую от двух параметров, и выборка эта потом будет использоваться в клиентском приложении в качестве источника строк поля со списком - то какой объект на сервере предпочтительнее создать: хранимую процедуру или табличную функцию?

Вообще, есть какие-то показания для однозначного выбора того или иного типа объекта?

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

То есть, некоторые вещи я вроде бы понимаю:

если мне нужна выборка, на основе которой делать форму, в которой можно обновлять, добавлять и удалять записи - то мне нужен View;

если мне нужно дать команду выполнить какую-то манипуляцию (скажем, обновить, добавить, удалить и тп.) - то нужна ханимая процедура;

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

(буду благодарна за уточнения или поправки, если я неправа даже в этих трех критериях)

А вот в случае, когда нужен просто набор данных - не для изменения, не для использования в запросах, без каких-либо манипуляций - вот тут я тереяюсь, какой тип объекта выбрать. Вью удалось отбросить благодаря наличию параметров и тому, что набор мне нужен отсортированный. Хранимка и табличная функция остались. По удобству использования в клиенте они мне одинаковы. Что выбрать?

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

Но вопрос об общих критериях выбора в пользу того или иного объекта, в ситуациях, позволяющих несколько вариантов, остается в силе.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.08.2016, 12:37
Ответы с готовыми решениями:

Триггер или хранимая процедура для удаления?
Добрый день! Помогите, пожалуйста, написать хранимую процедуру или триггер для удаления информации о выполненных работах по прошествии...

Хранимая процедура
Есть хранимая процедура, которая позволяет собрать данные по произведенным платежам из таблиц. Проблема в том что данная процедура...

Хранимая процедура
Попытался написать хранимую процедуру, которая при добавление данных в таблицу Сделка, автоматически добавляет код сделки в таблицу...

14
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.08.2016, 14:56
Тема обширная и холиварная.
С точки зрения гибкости взаимодействия с клиентом - предпочитетльнее процедуры. Даже для модифицируемых источников данных, но это уже зависит от возможностей клиента.
В вашем конкретном случае это проявится, например, если потребуется изменить критерий сортировки. В случае функции придется менять клиента со всеми вытекающими. В случае процедуры - только процедуру, причем работа пользователей не будет прервана.
1
шапоклякистка 8-го дня
 Аватар для texnik-san
3681 / 2241 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
28.08.2016, 19:29  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
предпочитетльнее процедуры. Даже для модифицируемых источников данных
В смысле - даже вместо вью?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.08.2016, 19:45
Цитата Сообщение от texnik-san Посмотреть сообщение
В смысле - даже вместо вью?
Да.
1
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.08.2016, 19:55
Цитата Сообщение от texnik-san Посмотреть сообщение
хранимую процедуру или табличную функцию?
Разве ХП может возвращать в виде значения набор?
Цитата Сообщение от texnik-san Посмотреть сообщение
есть какие-то показания для однозначного выбора того или иного типа объекта?
Для этого надо знать как именно запрашиваются данные. Например есть случаи, когда нужно произвести множественную выборку без применения индексации. Пишут функцию которой CURSOR формирует предварительный набор по некому проиндексированному критерию, отсеивая ненужное, а уже в функции фетчем проводится выборка по этому временному набору, возвращая только нужное.
Цитата Сообщение от texnik-san Посмотреть сообщение
а если мне нужно получить значение или набор данных, который я затем смогу использовать в других запросах - то функция.
View тоже можно использовать в других запросах.
Более того, если СУБД поддерживает такое (знаю Оракл такое умеет с 9-й версии), то условные параметры (WHERE секция) для View подставляются в само представление как бы становясь его частью. Тем самым обеспечивается аналогичное табличной функции оптимизированное действие тем самым избавляя СУБД делать два запроса.
А вот MS SQL так вроде не умеет. Хотя после 2005-й версии не вникала. Может и научили.
Цитата Сообщение от texnik-san Посмотреть сообщение
в случае, когда нужен просто набор данных - не для изменения, не для использования в запросах, без каких-либо манипуляций - вот тут я тереяюсь, какой тип объекта выбрать.
Лично я предпочитаю всегда табличную функцию. Это удобнее для АБД и не важно для самого пользователя.
Цитата Сообщение от texnik-san Посмотреть сообщение
в функции, как и во вью, тоже нельзя использовать сортировку
Смотря в какой. Насколько я помню есть два типа табличных функций. Одна - просто запрос, а вторая - полноценная функция возвращаюшая курсор. Во второй все можно.
1
шапоклякистка 8-го дня
 Аватар для texnik-san
3681 / 2241 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
28.08.2016, 20:13  [ТС]
Не, с формами на основе хранимок я пробовала - есть проблемы, связанные с разной сложностью разработки в случае вью и хранимки. Клиент у меня - проект .adp в аксес.

Юзеры уже пользовались аксесной базой и привыкли к встроенным средствам фильтрации и сортировки и хотят пользоваться ими дальше. Естсественно, аксесные фильтры с базой на сервере не работают, но у форм, основанных на вью, есть свойство "серверный фильтр", которому можно присвоить правильно сформированную строку и получить отфильтрованный результат. А строку я легко получаю, просто взяв строку, сформированную встроенным фильтром, и выполнив несколько несложных замен (скажем, символ подстановки не "*", а "%", кавычки не двойные, а одинарные, и т.п.)

А вот если источником даых формы сделать хранимую проедуру - это свойство ("серверный фильтр") ни на что не влияет, посто игронируется и все.

А к подвигу написания хранимки с числом параметров, охватывающем весь широчайший спектр возможностей, что и как могут захотеть отфильтровать пользователи + синтаксического анализатора строки - результата работы встроенного фильтра - для перевода фильтра пользователей в понятные хранимке параметры - я не готова абсолютно.

Добавлено через 5 минут
Цитата Сообщение от Hikari Посмотреть сообщение
Разве ХП может возвращать в виде значения набор?
Ну, термин "возвращает" тут не совсем корректен - возвращает ханимка всегда число; но результатом ее работы может являться набор, и даже не один.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.08.2016, 20:31
Цитата Сообщение от texnik-san Посмотреть сообщение
есть свойство "серверный фильтр", которому можно присвоить правильно сформированную строку и получить отфильтрованный результат.
В Access есть встроенный механизм SQL-injection?
1
шапоклякистка 8-го дня
 Аватар для texnik-san
3681 / 2241 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
28.08.2016, 20:44  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
В Access есть встроенный механизм SQL-injection?
Пока не знаю, не приходило в голову попробовать

Добавлено через 6 минут
Попробовала. Все нормально, injection не проходит.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.08.2016, 20:45
texnik-san, кстати есть способ возвращать из инлайновой функции/представления отсортированный набор:
T-SQL
1
2
3
4
5
6
7
8
9
create function dbo.MyFunction(...)
returns table as
return
 select top (cast(0x7fffffffffffffff as bigint))
  ...
 from
  ...
 order by
  ...;
Но лучше так не делать.
1
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.08.2016, 20:46
Цитата Сообщение от texnik-san Посмотреть сообщение
что и как могут захотеть отфильтровать пользователи + синтаксического анализатора строки
Что пользователи попались такие переборчивые в харчах?
Цитата Сообщение от texnik-san Посмотреть сообщение
которому можно присвоить правильно сформированную строку и получить отфильтрованный результат.
Впервые об этом слышу... Я конечно не сомневаюсь, что Акцесс способен выполнять динамический запрос тем более у него есть VBA, но сдается мне это не тот путь, который поможет добраться до решения.
Вообще конечно не стоит давать клиентам возможность формировать строку условий. В таких случаях, когда это все же необходимо набор делят на две части:
1) Получение всех данных, которые будут участвовать в динамической фильтрации
2) Фильтрование любым способом уже на стороне клиента, где SQL инъекции не страшны
Опять таки зависит от задачи. Даже если клиенты хотят запрашивать по 100 различным критериям, все равно никто не мешает АБД прописать 100 View или функций, а клиенту их вызывать и даже комбинировать вызовы разных функций.
1
шапоклякистка 8-го дня
 Аватар для texnik-san
3681 / 2241 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
28.08.2016, 21:00  [ТС]
Цитата Сообщение от Hikari Посмотреть сообщение
Что пользователи попались такие переборчивые в харчах?
Ну, современные версии аксес к пользователям весьма дружелюбны, а к хорошему привыкают быстро.

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

Строка формируется самим аксесом и попадает в свойство формы "фильтр". Пользователи этого свойства напрямую никак не касаются; сервера это свойство не касается тоже. Из "фильтр" в "серверный фильтр" строку переношу я, программно.

Что происходит дальше - как именно происходит фильтрация, на сервере или ее выполняет движок аксеса - я не знаю, и не знаю, где прочитать об этом. Но пока попытки инъекции через строку фильтра не дали результата.
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,600
29.08.2016, 03:19
Цитата Сообщение от Hikari Посмотреть сообщение
Разве ХП может возвращать в виде значения набор?
Может да
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create table T1(t_id int identity,
                t_DT datetime,
                t_Day int,
                )
-----------------------------------                
insert into T1(t_DT, t_Day) output inserted.*
values(GETDATE(), 10),
      (GETDATE(), 12),
      (GETDATE(), 15)
      
      
-------ХП
create proc MyProc
as
select * from T1
/* можно дописать where or and not............*/
 
-----Вызов ХП
exec MyProc
Цитата Сообщение от Hikari Посмотреть сообщение
которой CURSOR формирует предварительный набор по некому проиндексированному критерию,
Зачем CURSOR он же медленно работает , На пример я магу написать функция который возвращает таблицу
T-SQL
1
2
3
4
5
6
7
8
9
10
11
----- Функция 
CREATE FUNCTION MyFunction()
RETURNS TABLE  
AS
     RETURN (
             select * from T1
              /* можно дописать where or and not............*/
             )
 
-------и здесь с этим магу работать как таблица 
select * from MyFunction() where t_id=1
Цитата Сообщение от Hikari Посмотреть сообщение
Лично я предпочитаю всегда табличную функцию. Это удобнее для АБД и не важно для самого пользователя.
правильно

Цитата Сообщение от Hikari Посмотреть сообщение
Смотря в какой. Насколько я помню есть два типа табличных функций. Одна - просто запрос, а вторая - полноценная функция возвращаюшая курсор. Во второй все можно.
"табличных функций" который возвращает таблицу, сортировку можно
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
29.08.2016, 10:27
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Зачем CURSOR он же медленно работает
Это еще откуда такие сведения?
Цитата Сообщение от xxbesoxx Посмотреть сообщение
На пример я магу написать функция который возвращает таблицу
Есть второй тип функции, возвращающей набор: https://technet.microsoft.com/... .105).aspx
Он сложнее описывается, но гибче.
1
5972 / 4548 / 1094
Регистрация: 29.08.2013
Сообщений: 28,167
Записей в блоге: 3
30.08.2016, 11:31
Цитата Сообщение от Hikari Посмотреть сообщение
Это еще откуда такие сведения?
https://habrahabr.ru/post/149235/
там есть про курсоры пример

ЗЫ речь идет про курсоры в MSSQL
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
30.08.2016, 13:35
Цитата Сообщение от qwertehok Посмотреть сообщение
речь идет про курсоры в MSSQL
А-а-а, имеется ввиду нагрузка при полном проходе по полученному курсору?
Если получить курсор без лишних данных то ничего страшного не произойдет.
А кстати по-моему и над курсором можно производить SQL операции вместо описания прохода в цикле. Или ошибаюсь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2016, 13:35
Помогаю со студенческими работами здесь

Хранимая процедура
Что-то совсем не могу разобраться... Нужно написать хранимую процедуру, которая заполняет столбец таблицы, на основании других столбцов. ...

Хранимая процедура
Создал для курсовой базу данных Склад. Есть таблицы: Products(ProductID, Title, Category, Count INT NULL), Operations(OperationID,...

Хранимая процедура
Всем привет))))есть база данных ломбард)))есть маленькие таблицы)))как создать хранимую процедуру "Процедура на подсчёт процентов,...

Хранимая процедура
А1(ID, Группа, Предмет, День недели, Номер урока, Преподаватель) А2(Группа, Предмет, Количество уроков в неделю, Стоимость урока) ...

Хранимая процедура
Доброе утро! Нужно сделать хранимую процедуру для переноса столбца из одной таблицы в 3 других таблицы. В SQL не шарю, поэтому прошу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru