Неверный синтаксис рядом с ключевым словом «IF» - PullRequest
3 голосов
/ 25 мая 2011

Почему я получаю «Неверный синтаксис рядом с ключевым словом« IF »» в следующем SQL?:

use AdventureWorks
CREATE FUNCTION Query2_Function(@DPT INT)
RETURNS TABLE
AS
RETURN
IF @DPT is not null
select edh.departmentid,d.name,count(*)as cnt 
    From HumanResources.Employee e
    inner join HumanResources.EmployeeDepartmentHistory edh on e.employeeID = edh.employeeid
    inner join humanresources.department d on edh.departmentid = d.departmentid
    where d.Name = @dpt
    group by edh.departmentid, d.name

Ответы [ 2 ]

4 голосов
/ 25 мая 2011

Вы не можете иметь никакого потока управляющих операторов во встроенных табличных функциях. Если @dpt is null, запрос все равно вернет пустой набор результатов

Изменить: или, по крайней мере, будет, если правильный тип данных. У вас есть @DPT INT и вы сравниваете столбец name. Это кажется обреченным на неудачу во время выполнения.

Редактировать 2:

В качестве решения вы могли бы 1) просто удалить строку IF @DPT is not null и 2) либо

  • изменить тип параметра @DPT с INT на что-то вроде varchar(100), если функция должна была искать отдел по имени,

или

  • изменить предложение WHERE на что-то вроде этого:

    where d.departmentid = @dpt
    

    , если вы хотите выполнить поиск по идентификатору отдела.

2 голосов
/ 25 мая 2011

Попробуйте это

CREATE FUNCTION Query2_Function(@DPT INT)
RETURNS  @tbl TABLE 
   (
    departmentid    int  ,   
    [name]      varchar(100),
    cnt int          
   )
AS

begin

IF @DPT is not null
insert into @tbl (departmentid,name,cnt)
select edh.departmentid,d.name,count(*)as cnt 
    From HumanResources.Employee e
    inner join HumanResources.EmployeeDepartmentHistory edh on e.employeeID = edh.employeeid
    inner join humanresources.department d on edh.departmentid = d.departmentid
    where d.DepartmentID =@DPT 
    group by edh.departmentid, d.name
return  
 end

GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...