Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с созданием пользовательской функции, возвращающей таблицу. / 5 сообщений из 5, страница 1 из 1
12.02.2019, 13:48
    #39772806
Miguelito
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с созданием пользовательской функции, возвращающей таблицу.
Доброго времени суток, уважаемые коллеги!
Сразу пишу, что не смог найти решения на форумах, а сам второй день бьюсь.
Задача: упаковать скрипт в пользовательскую функцию, возвращающую таблицу. Раньше такого не делал. Потренировался на кошках – получается. Пробую упаковать свой скрипт – ругается:

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 ')'.

СРАЗУ ОГОВОРЮСЬ, ЧТО САМ СКРИПТ РАБОТАЕТ.
Или лыжи не те, или я… Есть сильное подозрение, что за простыми ошибочками, указанными выше, скрывается то, что в функцию я упаковываю скрипт, содержащий рекурсивный запрос.
Помогите!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
*********************************************************************************
Сам скрипт:
*********************************************************************************
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 ')'.
...
Рейтинг: 0 / 0
12.02.2019, 13:51
    #39772811
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с созданием пользовательской функции, возвращающей таблицу.
Miguelito,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- 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 [ ) ]  
[ ; ]  
...
Рейтинг: 0 / 0
12.02.2019, 13:52
    #39772814
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с созданием пользовательской функции, возвращающей таблицу.
Miguelito,

можете через UNION ALL переписать с условиями @Flag IS NULL и @FLAG IS NOT NULL
...
Рейтинг: 0 / 0
12.02.2019, 13:53
    #39772815
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с созданием пользовательской функции, возвращающей таблицу.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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
...
Рейтинг: 0 / 0
20.02.2019, 10:15
    #39776598
Miguelito
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с созданием пользовательской функции, возвращающей таблицу.
Лучше поздно, чем никогда )))
Коллеги, спасибо! Все получилось.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с созданием пользовательской функции, возвращающей таблицу. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]