Не могу создать функцию!!!

kika

Всем привет!!!Народ, подскажите как мне создать такую функцию, в которой будет цикл от 1 до 12, и проверяя несовпадение с параметром инсертишь в результирующую таблицу
21 ответ

kika

функцию.... инсертишь в результирующую таблицу
Только наверно не функцию, а хранимую процедуру!??


kika

Да, в процедуру!!!!Плиз, подскажите как это сделать!!!


kika

А как переменной присвоить набор данных от 1 до 12?А затем исключить из этого набора число, которому равна входящая переменная?


kika

Или все-таки табличную функцию ??? 1.Создать процедуру /функцию BOL->create procedureBOL->create function2.Чтоб был цикл от 1 до 12declare @i intset @i=1 while @i<=12 begin...set @i=@i+1end3. проверяя несовпадение с параметром if @i<>@parambegin..end4.инсертишь в результирующую ************* ...зы.. сори - ну не телепат я :(


kika

А как переменной присвоить набор данных от 1 до 12?А затем исключить из этого набора число, которому равна входящая переменная?
declare @numbers table(val int)insert @numbers select 0 union allselect 1 union allselect 2 union allselect 3 union allselect 4 union allselect 5 union allselect 6 union allselect 7 union allselect 8 union allselect 9 union allselect 10 union allselect 11 union allselect 12delete from @n where val=@param


kika

Что тут не так:
<pre class="prettyprint linenums">CREATE FUNCTION [dbo].[GetOtherMonths] (@m int ) RETURNS @res TABLE (mname varchar(50)) AS BEGIN declare @i int if @i=1 and @i<>@m BEGIN INSERT INTO @res (mname) VALUES ('sdfdsdf') END return END</pre>


kika

BOL::Control-of-Flow Language


kika

все так..написано:
<pre class="prettyprint linenums">declare @i int if @i=1 and</pre>
@i у вас всегда NULL значит условие никогда не выполнится..


kika

Пишет Invalid object name 'dbo.GetOtherM'.Что это может значить?


kika

kika, а где же у тебя цикл-то?!Надо так.
<pre class="prettyprint linenums"> SET @i = 1 WHILE @i <= 12 BEGIN IF @i <> @m INSERT INTO ... END </pre>


kika

А, да, еще до END надо SET @i = @i + 1


kika

CREATE FUNCTION [dbo].[GetOtherMonths]
Пишет Invalid object name 'dbo.GetOtherM'.Что это может значить?
я вам один умный вещь скажу - только не обижайтесь ....но пойму это значит - надо сходить прогуляться - развеятся :).


kika

kika, а где же у тебя цикл-то?!Надо так.
Что-то я все равно не понимаю как мне сделать функцию, которая бы имела некий набор данный:-порядковый номер (от 1 до 12)--- --- Месяц(January, Febrary и т.д.)---И выводила названия всех месяцев, кроме того, порядковый номер которого равен номеру входящего параметра?!


kika

<pre class="prettyprint linenums">CREATE FUNCTION dbo.Months (@number int) RETURNS @Table TABLE (MonthName varchar(12) NOT NULL) AS BEGIN DECLARE @Counter int SET @Counter = 1 WHILE @Counter <= 12 BEGIN IF @Counter <> @Number INSERT INTO @Table SELECT DATENAME(mm, '2004' + RIGHT('00' + CAST(@Counter AS varchar(2)), 2) + '01') SET @Counter = @Counter + 1 END RETURN END GO SELECT * FROM dbo.Months(6)</pre>
ЗЫ. Дефолтный язык у логина должен быть русский.


kika

Мне теперь пишет Invalid object name 'dbo.Months'.


kika

Кто пишет? После чего? В той ли базе запрос на выборку выполняете, где функцию создали?


kika

После того, как в процедуре вызываю dbo.Months (1) выдает ошибку: Invalid object name 'dbo.Months'.


kika

Можно увидеть, как вы это вызываете? Функция у вас действительно с владельцем dbo создана?


kika

pkarklin, спасибо тебе огромное!!!Все получилось!!!А как мне теперь еще добавить колонку с порядковым номером месяца?Мне нужно будет прикреплять это значение к ссылке(будет входящий параметр)?


kika

А как мне теперь еще добавить колонку с порядковым номером месяца?
<pre class="prettyprint linenums">alter FUNCTION dbo.Months (@number int) RETURNS @Table TABLE (id int identity(1,1),MonthName varchar(12) NOT NULL) AS BEGIN DECLARE @Counter int SET @Counter = 1 WHILE @Counter <= 12 BEGIN IF @Counter <> @Number INSERT INTO @Table(MonthName) SELECT DATENAME(mm, '2004' + RIGHT('00' + CAST(@Counter AS varchar(2)), 2) + '01') SET @Counter = @Counter + 1 END RETURN END GO SELECT * FROM dbo.Months(6)</pre>


kika

Если у вас в базе есть табличка с целыми числами от 1 до ..., то можно отказаться от цикла:
<pre class="prettyprint linenums">CREATE FUNCTION dbo.Monthes (@number int) RETURNS TABLE AS RETURN SELECT T1.colNumber AS MonthNumber, DATENAME(mm, '2004' + RIGHT('00' + CAST(T1.colNumber AS varchar(2)), 2) + '01') AS MonthName FROM tblNumbers T1 WHERE T1.colNumber <= 12 AND T1.colNumber <> @number</pre>