powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Передача Table-Valued Paramter в TVF
21 сообщений из 21, страница 1 из 1
Передача Table-Valued Paramter в TVF
    #39698959
sql_guru2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
есть table valued function, в которую я хочу передавать различное количество ид (брендов) для построения отчётности.
Выглядит она примерно так:
Код: 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.
CREATE TYPE IntArray AS TABLE (n int NOT NULL)

CREATE FUNCTION dbo.GetChainCheckins (
     @RequestedChainName VARCHAR(64)
    ,@RequestedBrandsIds IntArray READONLY
    ,@RequestedDateFrom DATE
    ,@RequestedDateTill DATE)
RETURNS TABLE
AS RETURN
(
	SELECT
		@RequestedDateFrom          AS PERIOD_START
		,@RequestedDateTill         AS PERIOD_END
		,@RequestedChainName        AS 'Chain'
		,COUNT(DISTINCT R.SHOP_ID) AS NUM_UNIQUE_CHECKINS
	FROM
        LOGS AS R

	WHERE
		R.DATE >= @RequestedDateFrom AND R.DATE <= @RequestedDateTill
		AND R.BRAND_ID in (SELECT n FROM @RequestedBrandsIds)
)

GO




Не могу разобраться, как теперь правильно вызывать эту функцию?
Наивный подход не работает:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT * FROM dbo.[GetChainCheckins](
    'Letoile',
    (SELECT 7 AS Id                 -- Vichy
    UNION SELECT 8                -- La Roche-Posay
    UNION SELECT 19              -- CeraVe
    UNION SELECT 17              -- Other DCA
    ),
    @RequestedDateFrom,
    @RequestedDateTill
);




Как правильно сформировать список из 4 брендов и передать его в функцию?

Спасибо
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39698960
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare @t IntArray 

insert @t
SELECT 7 AS Id                 -- Vichy
    UNION SELECT 8                -- La Roche-Posay
    UNION SELECT 19              -- CeraVe
    UNION SELECT 17              -- Other DCA


SELECT * FROM dbo.[GetChainCheckins](
    'Letoile',
    @t,
    @RequestedDateFrom,
    @RequestedDateTill
);
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39698961
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39698970
sql_guru2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

а можно это как-то инлайн сделать? Т.к. вызов сам по себе находится в TVF, и RETURN TABLE определяется автоматически. Если я начну добавлять DECLARE, то мне придется в ручную расписывать тип возвращаемой таблицы
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699023
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql_guru2,

сделайте обычную инлайновую функцию и соединяйте со своим селектом
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699034
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точнее, зачем функция нужна вообще не ясно
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699056
sql_guru2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Functions can only be inlined when they consist of a single SELECT statement which returns a result set.

А выше предлагается сделать subquery
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699057
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql_guru2TaPaK,

Functions can only be inlined when they consist of a single SELECT statement which returns a result set.

А выше предлагается сделать subquery
ээээ что?
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699069
sql_guru2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Вот из-за этого не получается сделать inline функцию, которая вызывает этот код:
Код: sql
1.
insert @t SELECT ... 
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699073
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql_guru2,

а просто сделатьселект из LOGS вам религиозные или какие убеждения не позовляют?
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699075
KRS544
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql_guru2TaPaK,

Вот из-за этого не получается сделать inline функцию, которая вызывает этот код:
Код: sql
1.
insert @t SELECT ... 


Это код не функции, а вызова этой функции
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699119
sql_guru2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KRS544,

Этот код будет лежать в своей, отдельной TVF.


TaPaK,

Этот сниппет будет использоваться в 40 отчетах, а копипастить 40 раз мне религия не позволяет, да.
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699125
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql_guru2KRS544,

Этот код будет лежать в своей, отдельной TVF.


TaPaK,

Этот сниппет будет использоваться в 40 отчетах, а копипастить 40 раз мне религия не позволяет, да.
т.е. 40 раз писать INSERT это нормально
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699137
sql_guru2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Изначально вопрос был как сделать SELECT прямо в списоке параметров.
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699142
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql_guru2TaPaK,

Изначально вопрос был как сделать SELECT прямо в списоке параметров.
уже ответили. Тот бред вашей функции сделать инлайн без
"AND R.BRAND_ID in (SELECT n FROM @RequestedBrandsIds)"
и

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * FROM dbo.<ваша бредовая функция>(    'Letoile',  @RequestedDateFrom,    @RequestedDateTill)
WHERE 
R.BRAND_ID in 
		(
			SELECT 7 AS Id                 -- Vichy
			UNION SELECT 8                -- La Roche-Posay
			UNION SELECT 19              -- CeraVe
			UNION SELECT 17              -- Other DCA
		)
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699144
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и гуру, же понимает тупиковость и проблемность табличных типов
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699146
sql_guru2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

В другом отчёте мне нужно 2 других бренда.
В теле отчета я хочу сделать:
Код: sql
1.
2.
3.
    ...
    CROSS APPLY
        dbo.<моя бредовая функция>(@ChainName, select 22 id union select 44, @RequestedDateFrom, @RequestedDateTill) AS AGGREGATE_BRAND_INFO



Понимаете, как сильно усложнится тело отчета (там еще 20 подобных параметров), если использовать ваш подход?
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699151
sql_guru2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

TaPaKну и гуру, же понимает тупиковость и проблемность табличных типов
Какие подводные камни могут быть? Расскажите.
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699153
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
    CROSS APPLY
        dbo.<моя бредовая функция>(@ChainName, select 22 id union select 44, @RequestedDateFrom, @RequestedDateTill) AS AGGREGATE_BRAND_INFO


тут только к психиатору
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699157
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql_guru2,

Хотите инлайновости - передавайте список значений через xml:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE FUNCTION dbo.GetChainCheckins (
     @RequestedChainName VARCHAR(64)
    ,@RequestedBrandsIds xml
    ,@RequestedDateFrom DATE
    ,@RequestedDateTill DATE)
RETURNS TABLE
AS RETURN
(
	SELECT
		@RequestedDateFrom          AS PERIOD_START
		,@RequestedDateTill         AS PERIOD_END
		,@RequestedChainName        AS 'Chain'
		,COUNT(DISTINCT R.SHOP_ID) AS NUM_UNIQUE_CHECKINS
	FROM
        LOGS AS R

	WHERE
		R.DATE >= @RequestedDateFrom AND R.DATE <= @RequestedDateTill
		AND R.BRAND_ID in (SELECT t.n.value('@n', 'int') FROM @RequestedBrandsIds.nodes('item') t(n))
)


Вызов
Код: sql
1.
2.
3.
...
    CROSS APPLY
        dbo.GetChainCheckins (@ChainName, '<item n = "22"/><item n = "44"/>', @RequestedDateFrom, @RequestedDateTill) AS AGGREGATE_BRAND_INFO



Если всегда нужно передавать список целых чисел, то можно просто строкой '22,44' и внутри задействовать какой-либо вариант функции распарсивания строки, вариантов которых на форуме полно.
...
Рейтинг: 0 / 0
Передача Table-Valued Paramter в TVF
    #39699168
sql_guru2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Спасибо больше, с xml получается как раз, как я хотел!
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Передача Table-Valued Paramter в TVF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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