Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с созданием пользовательской функции, возвращающей таблицу.  [new]
Miguelito
Member

Откуда:
Сообщений: 7
Доброго времени суток, уважаемые коллеги!
Сразу пишу, что не смог найти решения на форумах, а сам второй день бьюсь.
Задача: упаковать скрипт в пользовательскую функцию, возвращающую таблицу. Раньше такого не делал. Потренировался на кошках – получается. Пробую упаковать свой скрипт – ругается:

Msg 156, Level 15, State 1, Procedure fnPatientsQwantity, Line 9
Incorrect syntax near the keyword 'IF'.
Msg 102, Level 15, State 1, Procedure fnPatientsQwantity, Line 36
Incorrect syntax near ')'.

СРАЗУ ОГОВОРЮСЬ, ЧТО САМ СКРИПТ РАБОТАЕТ.
Или лыжи не те, или я… Есть сильное подозрение, что за простыми ошибочками, указанными выше, скрывается то, что в функцию я упаковываю скрипт, содержащий рекурсивный запрос.
Помогите!
*********************************************************************************
Сам скрипт:
*********************************************************************************
USE HospitalDb
GO

DECLARE @HospID AS INT
DECLARE @FLAG AS INT 

SET @HospID=1
SET @FLAG=1

IF @FLAG=0

	SELECT @HospID AS HospitalID, HospitalName, COUNT(P.PatientID) AS PatientsQwantity
	FROM SPRHospital AS S RIGHT JOIN Patients AS P
	ON S.HospitalID=P.HospitalID
	WHERE S.HospitalID=@HospID
	GROUP BY HospitalName

 ELSE 

	WITH RecCTE
	AS
	(
	SELECT S.HospitalID, S.HospitalName, S.ReportsTo
	FROM SPRHospital AS S
	WHERE S.HospitalID=@HospID
		UNION ALL
	SELECT S1.HospitalID, S1.HospitalName, S1.ReportsTo
	FROM RecCTE AS R JOIN
		 SPRHospital AS S1 ON R.HospitalID=S1.ReportsTO
	)
	SELECT R1.HospitalID, R1.HospitalName, COUNT(DISTINCT P.PatientID) AS PatientsQwantity
	FROM RecCTE AS R1 
	LEFT JOIN SPRHospital AS S2 ON R1.ReportsTO=S2.HospitalID
	LEFT JOIN Patients AS P ON R1.HospitalID=P.HospitalID
	GROUP BY R1.HospitalID, R1.HospitalName
	ORDER BY R1.HospitalID

*************************************************************************************
Скрипт по созданию функции:
*************************************************************************************
USE HospitalDb
GO

CREATE FUNCTION dbo.fnPatientsQwantity(@HospID AS INT, @FLAG AS INT=0)
	RETURNS TABLE 
	AS
	RETURN
(
IF @FLAG is NULL

	SELECT @HospID AS HospitalID, HospitalName, COUNT(P.PatientID) AS PatientsQwantity
	FROM SPRHospital AS S RIGHT JOIN Patients AS P
	ON S.HospitalID=P.HospitalID
	WHERE S.HospitalID=@HospID
	GROUP BY HospitalName

 ELSE 

	WITH RecCTE
	AS
	(
	SELECT S.HospitalID, S.HospitalName, S.ReportsTo
	FROM SPRHospital AS S
	WHERE S.HospitalID=@HospID
		UNION ALL
	SELECT S1.HospitalID, S1.HospitalName, S1.ReportsTo
	FROM RecCTE AS R JOIN
		 SPRHospital AS S1 ON R.HospitalID=S1.ReportsTO
	)
	SELECT R1.HospitalID, R1.HospitalName, COUNT(DISTINCT P.PatientID) AS PatientsQwantity
	FROM RecCTE AS R1 
	LEFT JOIN SPRHospital AS S2 ON R1.ReportsTO=S2.HospitalID
	LEFT JOIN Patients AS P ON R1.HospitalID=P.HospitalID
	GROUP BY R1.HospitalID, R1.HospitalName
	ORDER BY R1.HospitalID
	)
GO
******************************************************

Msg 156, Level 15, State 1, Procedure fnPatientsQwantity, Line 9
Incorrect syntax near the keyword 'IF'.
Msg 102, Level 15, State 1, Procedure fnPatientsQwantity, Line 36
Incorrect syntax near ')'.


Сообщение было отредактировано: 12 фев 19, 13:49
12 фев 19, 13:48    [21807355]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с созданием пользовательской функции, возвращающей таблицу.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Miguelito,

в inline function никаких IF и тп

-- Transact-SQL Inline Table-Valued Function Syntax   
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] [ READONLY ] }   
    [ ,...n ]  
  ]  
)  
RETURNS TABLE  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    RETURN [ ( ] select_stmt [ ) ]  
[ ; ]  
12 фев 19, 13:51    [21807361]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с созданием пользовательской функции, возвращающей таблицу.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Miguelito,

можете через UNION ALL переписать с условиями @Flag IS NULL и @FLAG IS NOT NULL
12 фев 19, 13:52    [21807364]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с созданием пользовательской функции, возвращающей таблицу.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
CREATE FUNCTION dbo.fnPatientsQwantity(@HospID AS INT, @FLAG AS INT=0)
	RETURNS TABLE 
	AS
	RETURN
(
	WITH RecCTE
	AS
	(
	SELECT S.HospitalID, S.HospitalName, S.ReportsTo
	FROM SPRHospital AS S
	WHERE S.HospitalID=@HospID
		UNION ALL
	SELECT S1.HospitalID, S1.HospitalName, S1.ReportsTo
	FROM RecCTE AS R JOIN
		 SPRHospital AS S1 ON R.HospitalID=S1.ReportsTO
	)
	SELECT @HospID AS HospitalID, HospitalName, COUNT(P.PatientID) AS PatientsQwantity
	FROM SPRHospital AS S RIGHT JOIN Patients AS P
	ON S.HospitalID=P.HospitalID
	WHERE S.HospitalID=@HospID and @FLAG is NULL
	GROUP BY HospitalName
        union all
	SELECT R1.HospitalID, R1.HospitalName, COUNT(DISTINCT P.PatientID) AS PatientsQwantity
	FROM RecCTE AS R1 
	LEFT JOIN SPRHospital AS S2 ON R1.ReportsTO=S2.HospitalID
	LEFT JOIN Patients AS P ON R1.HospitalID=P.HospitalID
	GROUP BY R1.HospitalID, R1.HospitalName
        where @FLAG is not NULL
	ORDER BY R1.HospitalID
	)
GO


Сообщение было отредактировано: 12 фев 19, 13:53
12 фев 19, 13:53    [21807367]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с созданием пользовательской функции, возвращающей таблицу.  [new]
Miguelito
Member

Откуда:
Сообщений: 7
Лучше поздно, чем никогда )))
Коллеги, спасибо! Все получилось.
20 фев 19, 10:15    [21815162]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить