Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Передача Table-Valued Paramter в TVF / 21 сообщений из 21, страница 1 из 1
06.09.2018, 12:54
    #39698959
sql_guru2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
Добрый день,
есть 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
06.09.2018, 12:56
    #39698960
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
Как-то так:

Код: 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
06.09.2018, 12:56
    #39698961
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
...
Рейтинг: 0 / 0
06.09.2018, 13:02
    #39698970
sql_guru2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
Гавриленко Сергей Алексеевич,

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

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

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

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

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

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

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

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

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


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

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


TaPaK,

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

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


TaPaK,

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

Изначально вопрос был как сделать SELECT прямо в списоке параметров.
...
Рейтинг: 0 / 0
06.09.2018, 16:10
    #39699142
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
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
06.09.2018, 16:12
    #39699144
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
ну и гуру, же понимает тупиковость и проблемность табличных типов
...
Рейтинг: 0 / 0
06.09.2018, 16:16
    #39699146
sql_guru2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
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
06.09.2018, 16:20
    #39699151
sql_guru2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
TaPaK,

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


тут только к психиатору
...
Рейтинг: 0 / 0
06.09.2018, 16:25
    #39699157
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
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
06.09.2018, 16:35
    #39699168
sql_guru2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача Table-Valued Paramter в TVF
invm,

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


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