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

Откуда:
Сообщений: 22
Привет всем!
Суть дела в том, что мне нужно написать функцию, которая будет в начале обновлять данные в строке, а потом выводить эту строку(таблицей), не мог бы кто-нибудь написать пример создания такой функции)
11 сен 11, 15:31    [11260415]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
Коляныч
Member

Откуда:
Сообщений: 279
Нельзя в функции ничего обновлять, запрещено, логическти неправильно - функция это хрень участвующая в сложных выражениях, и возможность у такой хотрожопой функции что-то менять сразу обламывает всякую возможность оптимизировать планы исполнения запросов. Можешь использовать хранимую процедуру для таких задач, которые апдейт делают
11 сен 11, 15:55    [11260461]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
BloodMaster
Member

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


Можно примерчик создания такой процедуры?
11 сен 11, 16:01    [11260472]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
iljy
Member

Откуда:
Сообщений: 8711
BloodMaster
Привет всем!
Суть дела в том, что мне нужно написать функцию, которая будет в начале обновлять данные в строке, а потом выводить эту строку(таблицей), не мог бы кто-нибудь написать пример создания такой ф ункции)

Функция не может изменять данные. Используйте процедуру, в ней оператор UPDATE с предложением OUTPUT.
11 сен 11, 16:03    [11260478]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
Коляныч
Member

Откуда:
Сообщений: 279
BloodMaster,

create table dbo.ttt (x int, y int)
insert dbo.ttt values (1, 100), (2, 200), (3, 300)
go

create proc dbo.myProc (@x int)
as
	update ttt set y = y + 1 output inserted.* where x = @x
go

-- вызываем хранимку и сохраняем результат её исполнения
declare @ttt table(x int, y int)
insert @ttt exec dbo.myProc 2
select * from @ttt
go

-- очистка организма
drop table dbo.ttt
drop proc dbo.myProc
go
11 сен 11, 16:13    [11260500]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
BloodMaster
Member

Откуда:
Сообщений: 22
Коляныч
BloodMaster,

create table dbo.ttt (x int, y int)
insert dbo.ttt values (1, 100), (2, 200), (3, 300)
go

create proc dbo.myProc (@x int)
as
	update ttt set y = y + 1 output inserted.* where x = @x
go

-- вызываем хранимку и сохраняем результат её исполнения
declare @ttt table(x int, y int)
insert @ttt exec dbo.myProc 2
select * from @ttt
go

-- очистка организма
drop table dbo.ttt
drop proc dbo.myProc
go


не совсем понял, у меня есть таблица t1(v1 int,v2 int)
нужно обновить номер в v1 и вывести v2 именно этой обновлённой строки, это будет делаться очень часто, поэтому думаю удалять хранимую процедуру не надо?! Как это будет выглядеть?
11 сен 11, 16:28    [11260546]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
BloodMaster
Member

Откуда:
Сообщений: 22
Коляныч,

особенно если это будут делать сразу 4-5 компов...
11 сен 11, 16:30    [11260550]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
iljy
Member

Откуда:
Сообщений: 8711
BloodMaster
не совсем понял, у меня есть таблица t1(v1 int,v2 int)
нужно обновить номер в v1 и вывести v2 именно этой обновлённой строки, это будет делаться очень часто, поэтому думаю удалять хранимую процедуру не надо?! Как это будет выглядеть?

Не надо - так не удаляйте, вопрос-то в чем??
11 сен 11, 16:37    [11260569]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
BloodMaster
поэтому думаю удалять хранимую процедуру не надо?!

Гениальное наблюдение.
BloodMaster
Как это будет выглядеть?

Вы удивитесь, но ЭТО будет выглядеть как отсутствие команды drop proc dbo.myProc. Что такое BOL в курсе?
11 сен 11, 16:39    [11260574]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
BloodMaster
Member

Откуда:
Сообщений: 22
ничего, если так сократить запрос и обойтись только вызовом процедуры?

exec dbo.myProc 2



SamMan, я новичок в SQL, поэтому незнаю что такое BOL.
12 сен 11, 13:56    [11263826]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
iljy
Member

Откуда:
Сообщений: 8711
BloodMaster
ничего, если так сократить запрос и обойтись только вызовом процедуры?
exec dbo.myProc 2



SamMan, я новичок в SQL, поэтому незнаю что такое BOL.

ФАК - Что такое BOL.
12 сен 11, 14:14    [11263979]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
Коляныч
Member

Откуда:
Сообщений: 279
BloodMaster
ничего, если так сократить запрос и обойтись только вызовом процедуры?
exec dbo.myProc 2


Да, если результат сразу отдаётся клиенту, то так и нужно, как вы написали. Пляски со временной таблицей были лишь для того, чтобы показать, каким образом вытаскивать результирующий набор записей для ещё каких-нибудь последующих операций внутри некого большого T-SQL запроса. Может быть парой строчек ниже вам захочется объединить этот вернувшийся рекордсет с ещё какими-то или переджойнить на какую-нибудь таблицу или ещё что-нибудь замысловатое сделать
12 сен 11, 20:32    [11266197]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
BloodMaster
Member

Откуда:
Сообщений: 22
Коляныч
BloodMaster
ничего, если так сократить запрос и обойтись только вызовом процедуры?
пропущено...


Да, если результат сразу отдаётся клиенту, то так и нужно, как вы написали. Пляски со временной таблицей были лишь для того, чтобы показать, каким образом вытаскивать результирующий набор записей для ещё каких-нибудь последующих операций внутри некого большого T-SQL запроса. Может быть парой строчек ниже вам захочется объединить этот вернувшийся рекордсет с ещё какими-то или переджойнить на какую-нибудь таблицу или ещё что-нибудь замысловатое сделать


Спасибо Вам большое! Выручили!
12 сен 11, 20:35    [11266206]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить