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

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

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

	return 
	
END


kika

BOL::Control-of-Flow Language


kika

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


kika

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


kika

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


kika

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


kika

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


kika

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


kika

CREATE FUNCTION dbo.Months (@number int) 
RETURNS @Table TABLE (MonthName varchar(<b>12</b>) NOT NULL) AS 
BEGIN 
 DECLARE @Counter int
 SET @Counter = <b>1</b>
 WHILE @Counter <= <b>12</b> BEGIN
 IF @Counter <> @Number
 INSERT INTO @Table SELECT DATENAME(mm, '2004' + RIGHT('00' + CAST(@Counter AS varchar(<b>2</b>)), <b>2</b>) + '01')
 SET @Counter = @Counter + <b>1</b>
 END
 RETURN
END
GO

SELECT 
 *
FROM
 dbo.Months(<b>6</b>)
ЗЫ. Дефолтный язык у логина должен быть русский.


kika

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


kika

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


kika

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


kika

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


kika

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


kika

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

SELECT 
 *
FROM
 dbo.Months(<b>6</b>)


kika

Если у вас в базе есть табличка с целыми числами от 1 до ..., то можно отказаться от цикла:
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(<b>2</b>)), <b>2</b>) + '01') AS MonthName
FROM
 tblNumbers T1
WHERE
 T1.colNumber <= <b>12</b> AND
 T1.colNumber <> @number