Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не удаётся включить функцию, возвращающую таблицу, в список SELECT / 9 сообщений из 9, страница 1 из 1
27.03.2018, 12:52
    #39621118
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
Добрый день.
Вопрос, который не даёт покоя: почему в 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
27.03.2018, 12:55
    #39621125
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
Код: sql
1.
2.
3.
4.
SELECT 
  F.*
from Puppies as P
cross /*outer*/ apply dbo.somefunc(P.ID) F
...
Рейтинг: 0 / 0
27.03.2018, 13:00
    #39621129
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
Максим Чистяков?7 КАК ТАКОЕ МОЖЫД БЫДЬ
MSDN
...
Рейтинг: 0 / 0
27.03.2018, 13:03
    #39621132
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
Ошибся с запросом создания функции, вот правильный код
Код: 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
27.03.2018, 13:08
    #39621135
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удаётся включить функцию, возвращающую таблицу, в список SELECT
Максим Чистяков,

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

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


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