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

Откуда:
Сообщений: 2
Что в ней не так? выдает первую ошибку на CREATE VIEW? подскажите пожалуйста

Написать функцию, вычисляющую кредитный процент для клиента.
В качестве параметра функции передается id клиента.
Величина процента зависит от срока, в течении которого данный человек
является клиентом банка и ежемесячных посуплений на счета клиента.
Начальное значение задается константой в теле функции (например, 9%).
Из этого значения вычитается количество полных лет, в течение которых человек является клиентом банка,
умноженное на 0.1; вычисляется среднее отношение дохода к расходу по всем счетам клиента за последние 2 года,
в случае, когда полученная величина больше 1, она умножается на 0.1 и вычитается из значения процента.
Минимальное возможное значение 4%.

use Bank;

CREATE PROCEDURE PROCENT (
	@cl_id int)
AS
BEGIN
	DECLARE @date_today DATETIME, @proc INT, @open INT, @age INT, @k INT
	CREATE VIEW accs AS SELECT * FROM account WHERE cl_id = @cl_id
	CREATE VIEW oper AS SELECT accs.curr_num, opcurr.acc_num, opcurr.op_id, opcurr.opcurr_val*(1+29*(curr_num-1)) AS summa , opcurr.opcurr_date 
	FROM accs JOIN opcurr ON accs.acc_num = opcurr.acc_num
	WHERE (DATEDIFF(year, opcurr.opcurr_date, CONVERT (DATETIME, GETDATE()))<2)
	SET @k = ((SELECT total FROM (SELECT op_id, sum(summa) as total 
	FROM oper GROUP BY op_id ) WHERE op_id = 1)/(SELECT total FROM (SELECT op_id, sum(summa) as total 
	FROM oper GROUP BY op_id ) WHERE op_id = 2))
    SET @date_today = CONVERT 
(DATETIME, GETDATE())
	IF @k>1 
		BEGIN 
		SET @k=@k*0.1
		SET @open = MIN(SELECT acc_open FROM accs)
		SET @age = DATEDIFF(year,@date_today,@open)
		SET @proc =9-@age*0.1-@k
		END
	ELSE
		BEGIN 
		SET @open = MIN(SELECT acc_open FROM accs)
		SET @age = DATEDIFF(year,@date_today,@open)
		SET @proc =9-@age*0.1-@k
		END
IF @proc<4 
	PRINT '4'
ELSE SELECT @proc
DROP VIEW accs
END


Сообщение было отредактировано: 8 дек 11, 22:45
8 дек 11, 22:42    [11733009]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Petr22
Что в ней не так? выдает первую ошибку на CREATE VIEW? подскажите пожалуйста
CREATE VIEW нельзя так создавать и использовать.
8 дек 11, 22:49    [11733057]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
Petr22
Member

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

Да я это примерно понимаю. а как надо поступить в данном случае? чем можно заменить?
8 дек 11, 22:51    [11733065]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
жесть
Guest
Petr22,

вариация на тему sql для фортепиано со скрипкой.
8 дек 11, 23:01    [11733125]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Petr22
чем можно заменить?
Ничем, нужно просто использовать таблицы, без всяких вью.
8 дек 11, 23:29    [11733261]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
alexeyvg
Petr22
чем можно заменить?
Ничем, нужно просто использовать таблицы, без всяких вью.
Только не это.
Нужно сделать VIEW и параметризованные вью один раз и заранее.
9 дек 11, 11:23    [11734920]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
dmitry stakanov
Member

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

почему не функции?
9 дек 11, 11:28    [11734974]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
dmitry stakanov
Mnior,

почему не функции?
Параметризованные представления - это как раз и есть инлайн функции
9 дек 11, 11:39    [11735105]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Mnior
alexeyvg
пропущено...
Ничем, нужно просто использовать таблицы, без всяких вью.
Только не это.
Нужно сделать VIEW и параметризованные вью один раз и заранее.
Не вижу в задаче ТС необходимости этого, зачем?
Что бы, читая код процедуры, нужно было найти текст ещё 2-х функций?
И как оптимизатор обработает вложенные функции, тоже не предскажу.

Функции нужно применять для каких то целей, например, для структурирования кода. А если просто на автомате для каждой процедуры делать для каждого запроса несколько функций для фрагментов запроса, создав их несколько тысяч (или десятков тысяч) - не вижу в этом смысла.
9 дек 11, 11:45    [11735186]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Но в тексте авторской процедуры такое количество глупостей, что странно обсуждать только одну.
Например, вот это:
DATEDIFF(year, opcurr.opcurr_date, CONVERT (DATETIME, GETDATE()))<2

По поводу VIEW я бы посоветовал сами запросы включить-таки
в основной запрос без создания каких бы то ни было объектов.
Да и от IF и локальных переменных можно запросто избавиться.
9 дек 11, 11:45    [11735193]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
iap
Но в тексте авторской процедуры такое количество глупостей, что странно обсуждать только одну.
Да понятно, лучьший комментарий уже был :-) 11733125
9 дек 11, 11:53    [11735293]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
alexeyvg
Что бы, читая код процедуры, нужно было найти текст ещё 2-х функций?

Функции нужно применять для каких то целей, например, для структурирования кода.
Согласен на все 100. Невнимателен, точнее я прото не переношу быдлокода.

alexeyvg
И как оптимизатор обработает вложенные функции, тоже не предскажу.
А в чём проблема? С чем сталкивались?
9 дек 11, 12:01    [11735405]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Mnior
alexeyvg
И как оптимизатор обработает вложенные функции, тоже не предскажу.
А в чём проблема? С чем сталкивались?
Ну вообще сталкивался с тем, что при вложенных VIEW оптимизатор теряется. Видимо, сложнее ему так варианты пробовать, не знаю... С функциями он может теряться ещё сильнее, например, предполагать, что можно сразу выполнить фильтр по условию в функции.
В общем, немного нестабильнее это работает, хотя теоретических обоснований для этого нет, и в принципе подход использовать inline функции для структурирования кода сам по себе хороший.
9 дек 11, 12:48    [11735786]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
iap, не согласен. похожи да, но не одно и то же. например, через представление можно обновлять данные. через функцию нет. у них задачи разные.
9 дек 11, 13:39    [11736326]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

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

вы не поверите:
create table t (c int)
go
create function fn_t (@c int)
returns table
as
return(select * from t where c = @c)
go
insert into fn_t(888) values (777)
go
select * from t
go
drop function fn_t
go
drop table t


Posted via ActualForum NNTP Server 1.5

9 дек 11, 13:53    [11736509]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
daw, попробуйте добавить вторую табличку (inner join) и запустить запрос.
9 дек 11, 14:17    [11736781]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
dmitry stakanov
daw, попробуйте добавить вторую табличку (inner join) и запустить запрос.
А Вы в представление ещё таблицу приджойнили?
И как? Отличается от инлайн функции со второй таблицей?

Главное отличие, как мне видится, - это невозможность создать триггер у функции.
9 дек 11, 14:21    [11736824]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> daw, попробуйте добавить вторую табличку (inner join) и запустить запрос.

а, типа, представление как-то по другому себя в этом случае вести будет?

Posted via ActualForum NNTP Server 1.5

9 дек 11, 14:25    [11736863]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
daw, да. если повесить триггер instead of.

я убедил, что функции и представления разные вещи?
9 дек 11, 14:27    [11736887]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
iap, джойн можно делать и там, и там. обновлять можно и там, там пока в определении она таблица.

я просто навскидку привер пример, чем отличается функция от представления.

например: в функцию можно передать параметр, в представлние - нет. представление можно индексировать, фукнцию - нет.

у этих объектов разные задачи.
9 дек 11, 14:33    [11736952]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
dmitry stakanov
daw, да. если повесить триггер instead of.

я убедил, что функции и представления разные вещи?
Дык они и не могут совпадать на 100%. Этого никто и не утверждал.
Иначе было бы что-то одно
9 дек 11, 14:33    [11736958]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> daw, да. если повесить триггер instead of.

в instead of триггере все равно придется прописывать
операции непосредственно с базовыми таблицами.
почти с тем же успехом можно и процедуру написать.

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

Posted via ActualForum NNTP Server 1.5

9 дек 11, 14:38    [11737013]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
daw, мне кажется, одно то, что в функцию можно передать параметр, а в представление только лишь летирал рушит сказанное Вами выше на ура)
9 дек 11, 14:48    [11737095]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
iap, согласен. просто не понимаю почему функцию нужно называть представлением)
9 дек 11, 14:57    [11737206]     Ответить | Цитировать Сообщить модератору
 Re: написание фунции1  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
iap, согласен. просто не понимаю почему функцию нужно называть представлением)
9 дек 11, 15:00    [11737233]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить