Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4360
Прошу прощения, что задаю вопрос, который не является уникальным случаем, но ответ пока не нашёл
C#, VS 2008.
Задача: добавить новую строку в таблицу и получить её ID:
Insert Into MyTable(v1,v2) 
values ('Peter', 18)
Select @@Identity --возвращает ID добавленной строки

Варианты:
  • Непосредственно в коде написать запрос, который всё делает как надо. Не подходит (писать SQL-запросы в коде - говнокод)
  • В объекте DataSet. Но там запрос можно создать только на одну инструкцию, либо Insert, либо Select.. Не получилось.
  • Создать хранимую функцию, возвращающую ID добавленной строки. Решение было бы идеальным, но она не имеет права вносить изменения в базу
  • Создать хранимую процедуру, она может вносить изменения в базу, но ничего не возвращает, так я не смогу получить ID.

    Как поступают обычно в таких случаях?

    как бы я хотел, чтобы выглядело решение:
    CREATE Function AddNewProject
        (@v1 nvarchar,
        @v2 nvarchar)
    returns int
    Begin
    
        INSERT INTO proj_CardForm
                          (v1,v2)
        VALUES     (@v1,@v2);
        return SELECT @@IDENTITY;
    end
    
  • 24 июн 13, 12:44    [14473446]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    Паганель
    Member

    Откуда: Винница
    Сообщений: 22550
    есть еще вариант использовать ORM...
    24 июн 13, 12:46    [14473459]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    f2f
    Guest
    В чем проблема с возвратом значений из хранимой процедуры?

    И, кстати, нужно использовать score_identity
    24 июн 13, 12:54    [14473518]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47063
    Charles Weyland
    писать SQL-запросы в коде - говнокод
    А по-моему, говнокод - это:
    Insert Into MyTable(v1,v2) 
    values ('Peter', 18)
    Select @@Identity --возвращает ID добавленной строки
    
    ибо отработает правильно далеко не всегда.

    Если остальной спич про компоненты Дельфи, то не вижу трудностей прописать в SQL.Text и INSERT, и SELECT и вообще что хотите (например, в TADOQuery).

    Процедура ничего не возвращает, говорите?! А мужики-то не знают!
    24 июн 13, 12:54    [14473525]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    Ruuu
    Member

    Откуда: Иркутск
    Сообщений: 4272
    Charles Weyland,

    автор
    Создать хранимую процедуру, она может вносить изменения в базу, но ничего не возвращает, так я не смогу получить ID.
    Может. Можно через SELECT или параметр OUT.
    смотрите SCOPE_IDENTITY()
    24 июн 13, 12:57    [14473551]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47063
    Ruuu
    Charles Weyland,

    автор
    Создать хранимую процедуру, она может вносить изменения в базу, но ничего не возвращает, так я не смогу получить ID.
    Может. Можно через SELECT или параметр OUT.
    смотрите SCOPE_IDENTITY()
    После этого создайте у MyTable триггер INSTEAD OF INSERT и наслаждайтесь!
    24 июн 13, 13:01    [14473591]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    Ruuu
    Member

    Откуда: Иркутск
    Сообщений: 4272
    iap
    Ruuu
    ...
    смотрите SCOPE_IDENTITY()
    После этого создайте у MyTable триггер INSTEAD OF INSERT и наслаждайтесь!
    Хм. А чем же тогда лучше пользоваться? OUTPUT table?
    24 июн 13, 14:17    [14474130]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47063
    Ruuu
    iap
    пропущено...
    После этого создайте у MyTable триггер INSTEAD OF INSERT и наслаждайтесь!
    Хм. А чем же тогда лучше пользоваться? OUTPUT table?
    Аналогично SCOPE_IDENTITY()

    В том-то и дело, что надо отслеживать внешние факторы: наличие/отсутствие всяких там триггеров...
    Ведь сейчас триггера нет, Вы уволились, а новый сотрудник - бац! - и создал! Триггер-то.
    24 июн 13, 14:20    [14474155]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31822
    Charles Weyland
    Как поступают обычно в таких случаях?
    Создать хранимую процедуру.
    Хранимая процедура может возвращать значения, так что всё нормально.
    24 июн 13, 14:43    [14474343]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31822
    iap
    Ruuu
    пропущено...
    Хм. А чем же тогда лучше пользоваться? OUTPUT table?
    Аналогично SCOPE_IDENTITY()

    В том-то и дело, что надо отслеживать внешние факторы: наличие/отсутствие всяких там триггеров...
    Ведь сейчас триггера нет, Вы уволились, а новый сотрудник - бац! - и создал! Триггер-то.
    Ну что теперь поделать, раз так работает :-(
    Это же не повод не пользоваться IDENTITY-полями.

    Новый сотрудник как создаст триггер, так и уберёт, INSTEAD OF триггеры обычно нетрудно заменить на что нибуть ещё.
    24 июн 13, 14:46    [14474369]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4360
    Используя это
    alexeyvg
    Создать хранимую процедуру.
    Хранимая процедура может возвращать значения, так что всё нормально.

    и это
    Ruuu
    смотрите SCOPE_IDENTITY()

    Я создал хранимую процедуру, она вернула таблицу, состоящую из одной ячейки (сбсна, Select SCOPE_IDENTITY()). В DataSet выбрал "добавить запрос в датаадаптер, используя существующую хранимую процедуру", далее студия предложила, чтобы эта процедура работала как скалярная функция, возвращающая одиночное значение (типа object) - это и есть то, чего я так хотел увидеть.

    Спасибо за советы!
    24 июн 13, 15:13    [14474564]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4360
    Хотела погрустить как положено: подоконник, плед, кофе... Обернулась пледом, неудобно, облилась кофе, да еще и жопа на подоконнике не помещается!
    Короче, не умею я грустить...
    11 ноя 13, 18:30    [15111113]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4360
    ой, не туда
    11 ноя 13, 18:30    [15111115]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    )))
    Guest
    не отчаивайся, зато получилось развеселить
    11 ноя 13, 18:35    [15111141]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47063
    Charles Weyland
    Я создал хранимую процедуру
    Charles Weyland
    Хотела погрустить
    Как много поменялось с 24 июня!
    11 ноя 13, 20:34    [15111604]     Ответить | Цитировать Сообщить модератору
     Re: Дилемма. Что использовать, хранимую функцию или процедуру?  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31822
    iap
    Charles Weyland
    Я создал хранимую процедуру
    Charles Weyland
    Хотела погрустить
    Как много поменялось с 24 июня!
    Ага. Но причина становится понятной:
    Charles Weyland
    ой, не туда
    11 ноя 13, 20:46    [15111654]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить