powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Странное поведение табличной инлайн функции с параметром константой или переменной
5 сообщений из 5, страница 1 из 1
Странное поведение табличной инлайн функции с параметром константой или переменной
    #40002232
Всем привет.

Коллеги, у меня какой-то странный спецэффект в табличной функции (только инлайн, если сделать многострочную все работает нормально). Повторяется на 2016 и 2019 (dev).

Почему результаты запросов при передаче параметра переменной или константой - разные и как с этим бороться? На смысл не обращайте внимания, я просто выделил минимально проблему.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or alter function dbo.wtf(@i int, @str nvarchar(4000), @sep char(1))
returns table as 
return (select i = @i, v = [value] from string_split(@str, @sep))
go

declare @i int = 1
declare @t table(s nvarchar(4000))

insert into @t(s) values (null)

select * from @t t outer apply dbo.wtf(@i, t.s, '|') -- WTF???
select * from @t t outer apply dbo.wtf(1, t.s, '|') -- Ожидаемо

go
drop function dbo.wtf
...
Рейтинг: 0 / 0
Странное поведение табличной инлайн функции с параметром константой или переменной
    #40002251
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.к. dbo.wtf это inline функция, то оптимизатор ее разворачивает и упрощает запрос.

В первом случае упрощается до

Код: sql
1.
select t.s, i = @i, wtf.v from @t t outer apply (select v = [value] from string_split(t.s, '|')) wtf



во втором

Код: sql
1.
select t.s, wtf.i, wtf.v from @t t outer apply (select i = 1, v = [value] from string_split(t.s, '|')) wtf



в плане запроса это видно


PS
Это конечно не отменяет того факта, что это баг.
...
Рейтинг: 0 / 0
Странное поведение табличной инлайн функции с параметром константой или переменной
    #40002256
Sybex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, интересное поведение. Можно даже упростить до такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or alter function dbo.wtf(@i int)
returns table as 
return (select top (0) i = @i)
go

declare @i int = 1

select * from (select 1 c) t outer apply dbo.wtf(@i)  -- WTF???
select * from (select 1 c) t outer apply dbo.wtf(1)   -- Ожидаемо

go
drop function dbo.wtf
...
Рейтинг: 0 / 0
Странное поведение табличной инлайн функции с параметром константой или переменной
    #40002261
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В качестве workaround-а

Код: sql
1.
2.
3.
select * from @t t outer apply dbo.wtf(@i + 0, t.s, '|') 
или
select * from @t t outer apply dbo.wtf(cast(@i as bigint) + 0, t.s, '|') 



ну или любой другой способ, форсирующий Scalar Operator над @i
...
Рейтинг: 0 / 0
Странное поведение табличной инлайн функции с параметром константой или переменной
    #40002273
msLex, премного благодарен!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Странное поведение табличной инлайн функции с параметром константой или переменной
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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