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

Откуда: Лермонтов
Сообщений: 197
Здравствуйте!

Попробовал определить свою процедуру вида:

USE mydb;
GO
CREATE PROCEDURE bng_normalize_ps ( ps_id uniqueidentifier, u_name VARCHAR(50), u_type VARCHAR(50) ) AS
BEGIN

	WITH Recursive (link, n_type, n_name, F_Parent )
	AS
	(
		SELECT
			i.link
			, ityp.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		JOIN ED_Network_Struct s on s.LINK = i.LINK
		WHERE
			ni.link = ps_id
		UNION ALL
		SELECT
			i.link
			, ityp.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		JOIN ED_Network_Struct s on s.LINK = i.LINK
		JOIN Recursive r ON s.F_Parent = r.link

	)
END;

Получаю ошибку:
автор
Msg 102, Level 15, State 1, Procedure bng_normalize_ps, Line 1 [Batch Start Line 2]
Неправильный синтаксис около конструкции "ps_id".


Скажите, пожалуйста, в чем моя ошибка?
27 сен 19, 17:27    [21981165]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6697
Борис Гаркун,

ну хелп откройте для приличия хоть, или быстрее тему создавать
27 сен 19, 17:29    [21981166]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
кажется понял, без скобок и с @. Спасибо. Наткнулся видимо на синтаксис другой БД
27 сен 19, 17:34    [21981172]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6697
Борис Гаркун
кажется понял, без скобок и с @. Спасибо. Наткнулся видимо на синтаксис другой БД

очень хотелось создать функцию, а получилось что-то
27 сен 19, 17:36    [21981174]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
Как-то так:
USE OmniUS;
GO
CREATE PROCEDURE bng_normalize_ps 
	@ps_id uniqueidentifier, 
	@u_name VARCHAR(50), 
	@u_type VARCHAR(50) 
AS
BEGIN

	WITH Recursive (link, n_type, n_name, F_Parent )
	AS
	(
		--SELECT intID, intParentID, strDepartmentName
		--FROM tblDepartment e
		--WHERE e.intID = 9 
		--UNION ALL
		--SELECT e.intID, e.intParentID, e.strDepartmentName
		--FROM tblDepartment e
		--	JOIN Recursive r ON e.intParentID = r.intID

		SELECT
			i.link
			, t.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		JOIN ED_Network_Struct s on s.LINK = i.LINK
		WHERE
			i.link = @ps_id
		UNION ALL
		SELECT
			i.link
			, t.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		JOIN ED_Network_Struct s on s.LINK = i.LINK
		JOIN Recursive r ON s.F_Parent = r.link

	)
	SELECT link, n_type, n_name, F_Parent
	FROM Recursive r
END
27 сен 19, 17:38    [21981179]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
iap
Member

Откуда: Москва
Сообщений: 46899
Борис Гаркун
Здравствуйте!

Попробовал определить свою процедуру вида:

USE mydb;
GO
CREATE PROCEDURE bng_normalize_ps ( ps_id uniqueidentifier, u_name VARCHAR(50), u_type VARCHAR(50) ) AS
BEGIN

	WITH Recursive (link, n_type, n_name, F_Parent )
	AS
	(
		SELECT
			i.link
			, ityp.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		JOIN ED_Network_Struct s on s.LINK = i.LINK
		WHERE
			ni.link = ps_id
		UNION ALL
		SELECT
			i.link
			, ityp.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		JOIN ED_Network_Struct s on s.LINK = i.LINK
		JOIN Recursive r ON s.F_Parent = r.link

	)
END;


Получаю ошибку:
автор
Msg 102, Level 15, State 1, Procedure bng_normalize_ps, Line 1 [Batch Start Line 2]
Неправильный синтаксис около конструкции "ps_id".


Скажите, пожалуйста, в чем моя ошибка?
Не вижу, где определяется ni?
27 сен 19, 21:37    [21981361]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 502
Борис Гаркун,

Вы получите ошибку при выполнении такого запроса безотносительно того, как он будет выполняться - напрямую в студии, через процедуру, через функцию или через вьюху.
Конструкция CTE - не может повиснуть просто в воздухе, нужен ее потребитель, причем порядок последующего пользования этим виртуальным представлением - CTE - имеет так же значение.

Почитайте хелп, ей-богу! Банальный же совершенно вопрос
28 сен 19, 13:28    [21981625]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
Всем спасибо, заработала
30 сен 19, 10:33    [21982416]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
Правда теперь на вот такой ее доработанный вариант ругается на конструкцию IF^
CREATE PROCEDURE bng_normalize_ps 
	@ps_id uniqueidentifier, 
	@u_name VARCHAR(50), 
	@u_type VARCHAR(50) 
AS
BEGIN

	WITH Recursive (link, n_type, n_name, F_Parent )
	AS
	(
		SELECT
			i.link
			, t.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
			-- , s.F_Child
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		LEFT JOIN ED_Network_Struct s on s.F_Child = i.LINK
		WHERE
			i.link = @ps_id
		UNION ALL
		SELECT
			i.link
			, t.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		JOIN ED_Network_Struct s on s.F_Child = i.LINK
		JOIN Recursive r ON s.F_Parent = r.link

	)

	IF EXISTS(SELECT n_name FROM Recursive r WHERE n_name LIKE '%' + @u_name + '%' AND n_type = @u_type GROUP BY n_name HAVING COUNT(*) > 1)
	BEGIN
		SELECT CONCAT('Удали дубли по ', @u_type, ' ', @u_name)
		RETURN
	END

	SELECT
		link, n_type, n_name, F_Parent
	FROM Recursive r
	SELECT link, n_type, n_name, F_Parent
	FROM Recursive r
	WHERE
		n_name LIKE '%' + @u_name + '%'
		AND n_type = @u_type -- LIKE '%' + @u_type + '%'
END

В чем может быть причина?
30 сен 19, 10:40    [21982423]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6697
Борис Гаркун,

вы пытаетесь угадать синтаксис TSQL?
30 сен 19, 10:41    [21982425]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
iiyama
Member

Откуда:
Сообщений: 618
Борис Гаркун,

Материализуйте результат вашего cte хотябы в виде временной таблицы, а потом используйте в разных местах процедуры

PS. Вторым запросом к Recursive Вы вышли из зоны видимости
30 сен 19, 10:51    [21982434]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
TaPaK, вспоминаю, опираясь на логику :)
30 сен 19, 10:51    [21982435]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
iiyama
Материализуйте результат вашего cte хотябы в виде временной таблицы, а потом используйте в разных местах процедуры

А зачем? Вроде и так работает
iiyama
PS. Вторым запросом к Recursive Вы вышли из зоны видимости

Это что значит, просветите, пожалуйста
30 сен 19, 10:53    [21982436]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
iiyama
Member

Откуда:
Сообщений: 618
Борис Гаркун,

;with cte as (select getdate () as [now])
select * from cte
select * from cte
30 сен 19, 11:03    [21982447]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
iiyama
Борис Гаркун,

;with cte as (select getdate () as [now])
select * from cte
select * from cte

Спасибо. На мой взгляд у меня почти тоже самое, только вместо cte Recursive. Разве нет?
30 сен 19, 11:13    [21982459]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
iap
Member

Откуда: Москва
Сообщений: 46899
Борис Гаркун
iiyama
Материализуйте результат вашего cte хотябы в виде временной таблицы, а потом используйте в разных местах процедуры

А зачем? Вроде и так работает
iiyama
PS. Вторым запросом к Recursive Вы вышли из зоны видимости

Это что значит, просветите, пожалуйста
WITH ... - это необязательная часть команд SELECT, DELETE, INSERT, UPDATE или MERGE.
А никакого не IF!
30 сен 19, 11:16    [21982462]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
iap
WITH ... - это необязательная часть команд SELECT, DELETE, INSERT, UPDATE или MERGE.
А никакого не IF!

Спасибо. А то что я заканчиваю WITH ) этого не достаточно, чтобы не относить WITH к IF?
30 сен 19, 11:21    [21982469]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
Борис Гаркун,

Достаточно открыть документацию и прочитать синтаксис с примерами. Нести чепуху со своими предположениями вовсе не обязательно.
30 сен 19, 11:25    [21982473]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
iiyama
Member

Откуда:
Сообщений: 618
Борис Гаркун,

+

CREATE PROCEDURE bng_normalize_ps 
	@ps_id uniqueidentifier, 
	@u_name VARCHAR(50), 
	@u_type VARCHAR(50) 
AS
BEGIN

	WITH Recursive (link, n_type, n_name, F_Parent )
	AS
	(
		SELECT
			i.link
			, t.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
			-- , s.F_Child
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		LEFT JOIN ED_Network_Struct s on s.F_Child = i.LINK
		WHERE
			i.link = @ps_id
		UNION ALL
		SELECT
			i.link
			, t.C_Name n_type
			, i.C_Name as n_name
			, s.F_Parent
		FROM ED_Network_Items i
		JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
		JOIN ED_Network_Struct s on s.F_Child = i.LINK
		JOIN Recursive r ON s.F_Parent = r.link

	)
	
	select * 
	into #Recursive
	from [Recursive]

	IF EXISTS(SELECT n_name FROM #Recursive r WHERE n_name LIKE '%' + @u_name + '%' AND n_type = @u_type GROUP BY n_name HAVING COUNT(*) > 1)
	BEGIN
		SELECT CONCAT('Удали дубли по ', @u_type, ' ', @u_name)
		RETURN
	END

	SELECT
		link, n_type, n_name, F_Parent
	FROM #Recursive r
	SELECT link, n_type, n_name, F_Parent
	FROM #Recursive r
	WHERE
		n_name LIKE '%' + @u_name + '%'
		AND n_type = @u_type -- LIKE '%' + @u_type + '%'
END

30 сен 19, 11:47    [21982497]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
TaPaK
Member

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

страдалец, скорее свой селект хочет перед ретурном
30 сен 19, 11:51    [21982502]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
iiyama, спасибо за науку. Получается перед использованием IF надо обратиться хоть раз к рекурсии?
30 сен 19, 12:07    [21982527]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3170
Борис Гаркун
iiyama, спасибо за науку. Получается перед использованием IF надо обратиться хоть раз к рекурсии?


пуззле продолжается
30 сен 19, 12:27    [21982561]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 197
Вопрос был риторический :)
30 сен 19, 12:36    [21982574]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 502
Борис Гаркун,

Я бы посоветовал результат выполнения CTE положить во временную таблицу, сформированную в теле той же процедуры.
Далее от CTE можно будет отвязаться, так как действительно есть нюансы использования табличных выражений, в плане когда, в каких конструкциях-условиях их необходимо использовать. У CTE немного непривычное время жизни, в отличие от традиционного понимания
30 сен 19, 15:01    [21982786]     Ответить | Цитировать Сообщить модератору
 Re: В чем ошибка синтаксиса создания процедуры?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
PsyMisha,

cte -- это такая же часть одного запроса, как секция from или where. Если это осознать, то желание писать другие стейтменты посреди конструкции запроса пропадет.
30 сен 19, 15:07    [21982801]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить