powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не удаётся включить функцию, возвращающую таблицу, в список SELECT
9 сообщений из 9, страница 1 из 1
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
    #39621118
Добрый день.
Вопрос, который не даёт покоя: почему в Select нельзя передать в пользовательскую табличную функцию имена параметров, получаемые этим же SELECT из столбцы таблицы?
Столбцы таблицы Puppies:
IDNumberNameIDParent1001 01Барбос1006100202Мухтар1006100303...1006100404...1006100505...1006100600...NULL100706...1001100807...1002100908...1003

Я хочу получить цепочку из Number для каждого ID на основании IDParent по иерархии прародителей, а также вычислить уровень от первого родителя. Для этого создаю функцию, которая возвращает табличное значение
Код: 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.
create function dbo.somefunc(@currID float)
returns @tSomeFunc Table (Path varchar(30), Level int)
as
begin
	declare @vLevel int = 1;
	declare @result varchar(10) ='';
	declare @currSMCD varchar(10);
	declare @vIDPARENT int = (select IDPARENT from WORKCENTER where ID = @currID);

	while (@vIDPARENT is not null)
	begin
		set @currSMCD = (select SMNEMOCODE from WORKCENTER where ID = @currID);
		set @currID = @vIDPARENT;
		set @vIDPARENT = (select IDPARENT from WORKCENTER where ID = @currID); 
		if @result  =''
		begin
			set @result = @currSMCD
			continue
		end
		set @result = @currSMCD + '-' + @result;
		set @vLevel += 1;

	end;

	set @currSMCD = (select SMNEMOCODE from WORKCENTER where ID = @currID);
	if @result  =''
	set @result = @currSMCD
	else set @result = @currSMCD + '-' + @result;
	insert into @tSomeFunc select top 1 @result, @vLevel
	return;
end
go



Чтобы не изучать смысл функции, скажу, что она склеивает Number'ы и возвращает их в @result, вычисляет уровень счётчиком и возвращает его в vLevel.

Если сделать
Код: sql
1.
select * from dbo.somefunc (1001)

она вернёт требующиеся значения

Однако, если я не пойму, как передать в неё ID из таблицы. Когда я пишу
Код: sql
1.
SELECT dbo.somefunc(P.ID) from Puppies as P


получаю ответ Не удалось найти столбец "dbo", определяемую пользователем функцию или агрегатную функцию "dbo.somefunc". Также возможно, имя является неоднозначным.

Масла подливает то, что если приведённую выше функцию превратить в две, которые вместо TABLE они возвращали одна varchar , другая int, и соединить их в виде
Код: sql
1.
select dbo.findLevel(P.ID) as Уровень, dbo.findPath(P.ID) as Путь from Puppies as P


то работать они будут:
LevelPath200-01300-01-06200-02300-02-07200-03300-03-08200-04200-05

?7 КАК ТАКОЕ МОЖЫД БЫДЬ

Спасибо.
...
Рейтинг: 0 / 0
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
    #39621125
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SELECT 
  F.*
from Puppies as P
cross /*outer*/ apply dbo.somefunc(P.ID) F
...
Рейтинг: 0 / 0
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
    #39621129
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим Чистяков?7 КАК ТАКОЕ МОЖЫД БЫДЬ
MSDN
...
Рейтинг: 0 / 0
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
    #39621132
Ошибся с запросом создания функции, вот правильный код
Код: 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.
create function dbo.somefunc(@currID float)
returns @tSomeFunc Table (Path varchar(30), Level int)
as
begin
	declare @firstID float = @currID;
	declare @vLevel int = 1;
	declare @result varchar(10) ='';
	declare @currSMCD varchar(10);
	declare @vIDPARENT int = (select IDPARENT from Puppies where ID = @currID);

	while (@vIDPARENT is not null)
	begin
		set @currSMCD = (select Number from Puppies where ID = @currID);
		set @currID = @vIDPARENT;
		set @vIDPARENT = (select IDPARENT from Puppies where ID = @currID); 
		if @result  =''
		begin
			set @result = @currSMCD
			continue
		end
		set @result = @currSMCD + '-' + @result;
		set @vLevel += 1;

	end;

	set @currSMCD = (select Number from Puppies where ID = @currID);
	if @result  =''
	set @result = @currSMCD
	else set @result = @currSMCD + '-' + @result;
	insert into @tSomeFunc select top 1 @result, @vLevel
	return;
end
go

...
Рейтинг: 0 / 0
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
    #39621135
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим Чистяков,

Попробуй таким образом:
Код: sql
1.
set @currSMCD = (select top 1 SMNEMOCODE from WORKCENTER where ID = @currID);
...
Рейтинг: 0 / 0
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
    #39621137
Гавриленко Сергей Алексеевич, спасибо.
...
Рейтинг: 0 / 0
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
    #39621140
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим Чистяков,

функция не нужна. CTE в самом оригинально применении
...
Рейтинг: 0 / 0
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
    #39621142
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopelly,
А вообще - Смотри первый ответ...
...
Рейтинг: 0 / 0
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
    #39621527
Большое спасибо всем, кто помог. Узнал кое-что полезное.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не удаётся включить функцию, возвращающую таблицу, в список SELECT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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