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

Откуда: Израиль / Москва
Сообщений: 295
Можно ли выполнять INSERT в UD Function?

По логике можно, но у меня пишет что INSERT не верен, хотя в Query Analyzer работает...
8 авг 05, 15:17    [1770515]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнять INSERT в UD Function?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
igoro1975
Можно ли выполнять INSERT в UD Function?

Только в переменные-таблицы.

igoro1975
По логике можно, но...

По чьей логике? По вашей личной? Есть такая вещь, как документация. Очень помогает, когда проблемы с логикой.
8 авг 05, 15:21    [1770529]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли выполнять INSERT в UD Function?  [new]
Breakneck
Member

Откуда: Kiev
Сообщений: 2454
BOL

The following statements are allowed in the body of a multi-statement function. Statements not in this list are not allowed in the body of a function:
  • Assignment statements.
  • Control-of-Flow statements.
  • DECLARE statements defining data variables and cursors that are local to the function.
  • SELECT statements containing select lists with expressions that assign values to variables that are local to the function.
  • Cursor operations referencing local cursors that are declared, opened, closed, and deallocated in the function. Only FETCH statements that assign values to local variables using the INTO clause are allowed; FETCH statements that return data to the client are not allowed.
  • INSERT, UPDATE, and DELETE statements modifying table variables local to the function.
  • EXECUTE statements calling an extended stored procedures.

  • INSERT возможен только в таблицы-переменные
    8 авг 05, 15:21    [1770531]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли выполнять INSERT в UD Function?  [new]
    igoro1975
    Member

    Откуда: Израиль / Москва
    Сообщений: 295
    GreenSunrise
    igoro1975
    Можно ли выполнять INSERT в UD Function?

    Только в переменные-таблицы.

    igoro1975
    По логике можно, но...

    По чьей логике? По вашей личной? Есть такая вещь, как документация. Очень помогает, когда проблемы с логикой.

    Извините, но как быть в случае, что в запросе есть обращение к функции, там есть проверки и затем, если нужно, нужно вставить строку в базу...

    Как этого добиться?
    10 авг 05, 13:24    [1773997]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли выполнять INSERT в UD Function?  [new]
    GreenSunrise
    Member

    Откуда:
    Сообщений: 12310
    Напрямую - никак.
    Функция в сиквеле - это механизм, ВОЗВРАЩАЮЩИЙ данные. Функции могут быть использованы, например, в селектах. И что по-вашему, получится из такого использования??? Запускаем селект, который - внимание! - ИЗМЕНЯЕТ данные. Вам это не кажется неестественным?

    Таким образом, что вы можете сделать:

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

    2. Вставить в функцию вызов xp_cmdshell, в ней звать osql/isql/isqlw, в них выполнять нужные вам изменения данных. Поскольку xp_cmdshell - расширенная хранимая процедура, это работает.

    Код примерно такой:
    create function f1()
    returns @res table (i int)
    as
    begin
        declare @i int
        set @i = 123
    
        exec master..xp_cmdshell 'osql -d yourdb -E -n -Q "insert into t1 values (876)"'
    
        insert into @res values (123)
        return
    end

    3. Написать свою расширенную хранимую процедуру, которую можно звать из функции (в отличие от простых хр. процедур). В ней выполнять действия по изменению данных. Читать хелп по словам Extended stored procedures.

    Имхо, 2 и 3 способ плохие, потому что функция НЕ ДОЛЖНА менять данные. Тем не менее, это работает.
    10 авг 05, 13:41    [1774081]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли выполнять INSERT в UD Function?  [new]
    igoro1975
    Member

    Откуда: Израиль / Москва
    Сообщений: 295
    Спасибо, сейчас почитаю, а вот еще вопрос:
    Могу ли я в select, и в нем case when:
    id_new = 
    	CASE	WHEN id_old is null THEN
    			sp_do_new_id() -- делает INSERT и возвращает new id
    		ELSE id_old
    	END,
    
    использовать процедуру (sp_do_new_id()), что возвращает результат INSERT-а?
    10 авг 05, 14:00    [1774191]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли выполнять INSERT в UD Function?  [new]
    GreenSunrise
    Member

    Откуда:
    Сообщений: 12310
    Если сумеете написать функцию sp_do_new_id(), то сумеете ее и в селекте использовать.

    Но я вам еще раз настоятельно рекомендую пересмотреть свой подход к функциям. Вы пытаетесь сделать концептуально неверные вещи, которые могут привести к самым дурацким последствиям. Функции используются для ВОЗВРАТА данных. Для возврата, а не для изменения.

    Не надо шурупы забивать молотком. Можно, но не нужно. Функциональность у шурупов другая...
    10 авг 05, 14:21    [1774321]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли выполнять INSERT в UD Function?  [new]
    igoro1975
    Member

    Откуда: Израиль / Москва
    Сообщений: 295
    GreenSunrise
    Если сумеете написать функцию sp_do_new_id(), то сумеете ее и в селекте использовать.

    Но я вам еще раз настоятельно рекомендую пересмотреть свой подход к функциям. Вы пытаетесь сделать концептуально неверные вещи, которые могут привести к самым дурацким последствиям. Функции используются для ВОЗВРАТА данных. Для возврата, а не для изменения.

    Не надо шурупы забивать молотком. Можно, но не нужно. Функциональность у шурупов другая...

    Я не имел ввиду функцию, а sp_do_new_id() - это процедура, но я не знаю, как ее использовать в запросе.
    10 авг 05, 14:27    [1774367]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли выполнять INSERT в UD Function?  [new]
    GreenSunrise
    Member

    Откуда:
    Сообщений: 12310
    FAQ->Select из результата выполнения хранимой процедуры
    10 авг 05, 14:41    [1774483]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить