Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Ошибки в запросе


Автор: BASSoft 25.1.2008, 18:46
Создаю функцию:

Код

CREATE FUNCTION ДобавитьОтдел(@Отдел varchar(50), @Комментарий nvarchar(max))
RETURNS int
AS
BEGIN
    
    Declare @НомерОтдела int
    if  not exists(select @НомерОтдела=НомерОтдела from dbo.Отделы where Название like @Отдел)
    begin
        insert into dbo.Отделы(Название,Комментарий)  values (@Отдел,@Комментарий)
        return (select НомерОтдела from dbo.Отделы where Название like @Отдел)
    end 
    else begin
        RETURN (@НомерОтдела)
    end    
END
GO


При выполнении этого запроса возникает сообщение об ошибках:

Msg 102, Level 15, State 1, Procedure ДобавитьОтдел, Line 17
Incorrect syntax near '='.
Msg 156, Level 15, State 1, Procedure ДобавитьОтдел, Line 22
Incorrect syntax near the keyword 'else'.


Подскажите, что не так в моем коде 

Автор: Akina 25.1.2008, 18:50
smile  ошибки в строках 17 и 22, а в приведенном коде всего 16 строк...

Автор: BASSoft 25.1.2008, 18:53
Просто я удалил стандартные комментарии из кода

Автор: Magnifico 26.1.2008, 13:15
Так попробуй (надеюсь поле НомерОтдела у тебя счетчик ):
Код

CREATE proc ДобавитьОтдел
@Отдел varchar(50), @Комментарий nvarchar(max)
AS
BEGIN
    
   -- Declare @НомерОтдела int
    if  not exists(select НомерОтдела from dbo.Отделы where Название like @Отдел)
        begin
            
          insert into dbo.Отделы(Название,Комментарий)  values (@Отдел,@Комментарий)
           select НомерОтдела from dbo.Отделы where Название like @Отдел
        end 
   else 

      begin 
         select НомерОтдела from dbo.Отделы where Название like @Отдел
      end

END


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

так нельзя сравнивать идет присвоение
Код

 if  not exists(select @НомерОтдела=НомерОтдела from dbo.Отделы where Название like @Отдел)


вот так только
Код

if  not exists(select НомерОтдела from dbo.Отделы where Название like @Отдел)


Автор: BASSoft 26.1.2008, 15:46
Цитата

так нельзя сравнивать идет присвоение
 
А мне как раз и нужно присвоение


Цитата

оператор Return должен быть в функции последним,

Не слышал о таком. Это точно так? Попробую, может и так.

Цитата

в коде функции нельзя выполнять команды DML - только в процедуре,

В книге Михаила Фленова "Transact SQL" говориться, что все что используеться в процедуре может использоваться и в  функции  

Автор: BASSoft 26.1.2008, 16:20
Похоже действительно в только в процедуре можно. А хотелось бы в функции. Неужели нельзя использовать Insert в функции?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)