Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Есть ли альтернатива динамическому запросу внутри функции? / 25 сообщений из 28, страница 1 из 2
10.02.2021, 21:14
    #40044203
ol_chig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
Динамические запросы вещь удобная, но их формирование и дальнейшая работа внутри функции нереализуема (или нет?), т.к. "Выполнение запроса внутри функции может привести к нарушению основного контракта UDF - не изменять состояния базы данных. Ничто не мешает написать DROP внутри EXEC'a, что приведет к нарушению этого контракта."

Собственно есть один вопрос: можно ли сформировать динамический запрос и запустить его внутри функции без использования EXEC? Приму в дар любые варианты.

По сути запрос простой и выглядит примерно так
Код: sql
1.
'select' +  @column + ' from table'

, где @column - имя поля, которое меняется.
...
Рейтинг: 0 / 0
10.02.2021, 21:47
    #40044209
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chig,

а) чтобы выполнить динамический запрос нужно запустить процедуру,
б) процедуры внутри UDF функций не поддерживаются (за очень специфичным исключением)
в) ещё можно через свою CLR конечно.

впросы ко время исправления внизу? написал скрипт машины времени.
...
Рейтинг: 0 / 0
11.02.2021, 03:28
    #40044254
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chigПриму в дар любые варианты.Наймите архитектора, который вам расскажет, что надо или можно делать, а что нет. Можно делать, когда фантазировать надоест.
...
Рейтинг: 0 / 0
11.02.2021, 10:01
    #40044301
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
vikkiv
ol_chig,

а) чтобы выполнить динамический запрос нужно запустить процедуру
Необязательно
...
Рейтинг: 0 / 0
11.02.2021, 10:31
    #40044324
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chig
Динамические запросы вещь удобная, но их формирование и дальнейшая работа внутри функции нереализуема (или нет?), т.к. "Выполнение запроса внутри функции может привести к нарушению основного контракта UDF - не изменять состояния базы данных. Ничто не мешает написать DROP внутри EXEC'a, что приведет к нарушению этого контракта."

Собственно есть один вопрос: можно ли сформировать динамический запрос и запустить его внутри функции без использования EXEC? Приму в дар любые варианты.

По сути запрос простой и выглядит примерно так
Код: sql
1.
'select' +  @column + ' from table'

, где @column - имя поля, которое меняется.


1. Количество полей в таблице априорно ограничено.
2.
Код: sql
1.
2.
3.
if @column  = 'column1' select column1 from table
else if @column  = 'column2' select column2 from table
...



3. дерзайте.
...
Рейтинг: 0 / 0
11.02.2021, 11:40
    #40044364
ol_chig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
iap
vikkiv
ol_chig,

а) чтобы выполнить динамический запрос нужно запустить процедуру
Необязательно

Сейчас я в переменную собираю запрос и выполняю его через EXEC, который нельзя использовать внутри функции.
Подскажите как еще?

aleks222

1. Количество полей в таблице априорно ограничено.
2.
Код: sql
1.
2.
3.
if @column  = 'column1' select column1 from table
else if @column  = 'column2' select column2 from table
...



3. дерзайте.


Совет интересный, жаль в таблице 695 полей, придется отбирать все возможные варианты и писать много строчек кода.
...
Рейтинг: 0 / 0
11.02.2021, 15:14
    #40044462
Есть ли альтернатива динамическому запросу внутри функции?
Касательно перебора полей можно это все нагенерить как бы... но в рамках функции это все равно не обернуть

Код: 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.
34.
35.
36.
DROP TABLE IF EXISTS dbo.tbl
GO

CREATE TABLE dbo.tbl (a INT, b INT, c INT, d INT)
GO

DROP TABLE IF EXISTS #t
SELECT [name] = ',' + [name]
INTO #t
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.tbl')

DECLARE @rn INT = @@rowcount

DROP TABLE IF EXISTS #variants

;WITH cte AS
(
    SELECT lvl = @rn, x = (
        SELECT [name]
        FROM #t
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')

    UNION ALL

    SELECT t1.lvl - 1, REPLACE(t1.x, t2.[name], '')
    FROM cte t1
    CROSS APPLY #t t2
    WHERE t1.lvl > 1
)
SELECT DISTINCT x
INTO #variants
FROM cte

SELECT 'select ' + STUFF(x, 1, 1, '') + ' from dbo.tbl'
FROM #variants
...
Рейтинг: 0 / 0
11.02.2021, 15:54
    #40044485
ol_chig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
Sergey Syrovatchenko, тем не менее спасибо за пример, возможно где-то пригодится
...
Рейтинг: 0 / 0
11.02.2021, 16:01
    #40044488
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chig
Sergey Syrovatchenko, тем не менее спасибо за пример, возможно где-то пригодится


в другой работе, например
...
Рейтинг: 0 / 0
11.02.2021, 19:43
    #40044610
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
Ролг Хупин,
НА другой...
...
Рейтинг: 0 / 0
11.02.2021, 21:17
    #40044637
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
Совет интересный, жаль в таблице 695 полейБыл душевнобольной разработчик.
...
Рейтинг: 0 / 0
11.02.2021, 21:52
    #40044642
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
uaggster,

Наверное здесь приоритет на значимости немного другого синтаксиса.
Общество любителей литературы и поэзии чуть-чуть в другом месте.

L_argo,

Может опыта широты задач не хватает? Есть достаточно ситуаций когда такой подход вполне оправдан,
напр. у нас в первичном Stage из CSV и прочих бывает заливается и побольше полей..
...
Рейтинг: 0 / 0
11.02.2021, 22:39
    #40044650
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
L_argo
Совет интересный, жаль в таблице 695 полей
Был душевнобольной разработчик.
Тема вообще бред.
Попытка скомпенсировать недостаток знаний бурным воображением. Отсюда "космические" решения.
...
Рейтинг: 0 / 0
12.02.2021, 09:42
    #40044731
ol_chig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
Владислав Колосов
L_argo
пропущено...
Был душевнобольной разработчик.

Тема вообще бред.
Попытка скомпенсировать недостаток знаний бурным воображением. Отсюда "космические" решения.

Таблица является справочным хранилищем, где есть поле, указывающее на вид аналитики. Ее проектированием занимался не один душевнобольной разработчик, а целая компания, которая неплохо продает свой продукт.
...
Рейтинг: 0 / 0
12.02.2021, 11:37
    #40044763
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chig
Динамические запросы вещь удобная, но их формирование и дальнейшая работа внутри функции нереализуема (или нет?)
Если пересоздавать каждый раз функцию с нужным текстом и "фиксированным" именем, то вопрос перейдёт от выполнения динмического sql внутри UDF к "фиксации" имени. Но придётся разбираться с одновременным выполнением и кешированием/перекомпиляцией.
...
Рейтинг: 0 / 0
12.02.2021, 12:13
    #40044775
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chig
Ее проектированием занимался не один душевнобольной разработчик, а целая компания, которая неплохо продает свой продукт.
Продаваемость очень мало коррелирует с вменяемостью разработчиков.

Нужно иметь либо серьезные основания, либо низкую квалификацию, чтобы делать таблицу с таким количеством столбцов.
...
Рейтинг: 0 / 0
12.02.2021, 12:29
    #40044781
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chig,

ваш разработчик сделал удобно для себя (я не уверен в этом) , но неудобно для вас - для потребителя данных. Задайте ему вопрос, каким он видит эффективное обращение к его таблице.
...
Рейтинг: 0 / 0
12.02.2021, 13:11
    #40044796
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
.Евгений,

Не сильно разумно сваливать всё на кого-то, есть достаточно вполне приемлемых решений с собственными генераторами запросов на основе метаданных+модель и со своей встроенной специфичной логикой в зависимости от требований, у них свой фэн-шуй и приоритеты отличные от его понимания разработчиками баз данных. Напр. у нас рисковые не агрегируемые метрики за 700 полей из внешних (дорогих) систем могут вполне легко улететь..
...
Рейтинг: 0 / 0
12.02.2021, 13:23
    #40044801
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
vikkiv,

Я не говорю, что 695 полей делать неправильно, нельзя или глупо. Это отдельный вопрос, который обсуждать как минимум рано.
Я говорю о том, что провайдер данных (с моей точки зрения) должен не просто нагенерить их тем или иным способом, но представить их так, чтобы потребителю этих данных было удобно их использовать .

Когда потребитель данных обращается к третьей стороне для преобразования этих данных, то данные, очевидно, не представлены в удобном для него виде. Возможно, это задача ETL - если провайдер по каким-то причинам не может или не хочет дать к ним удобный доступ.
...
Рейтинг: 0 / 0
14.02.2021, 01:24
    #40045164
HornetBlack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chig,

если работать с порядковым номером поля, то можно немного короче:
select choose(@num,column1,column2,...) from table
...
Рейтинг: 0 / 0
18.02.2021, 12:47
    #40046619
ol_chig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
HornetBlack
ol_chig,

если работать с порядковым номером поля, то можно немного короче:
select choose(@num,column1,column2,...) from table


Данная конструкция позволит по номеру определить имя поле, которое мне и так известно.
Может я не так понял и из этого нужно вырулить куда-то?
...
Рейтинг: 0 / 0
18.02.2021, 14:11
    #40046671
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chig,

это же не динамический запрос.
...
Рейтинг: 0 / 0
18.02.2021, 14:18
    #40046678
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
HornetBlack
ol_chig,

если работать с порядковым номером поля, то можно немного короче:
select choose(@num,column1,column2,...) from table



нельзя так делать

тип данных, возвращаемый choose, не зависит от первого параметра

https://docs.microsoft.com/en-us/sql/t-sql/functions/logical-functions-choose-transact-sql?view=sql-server-ver15
Return Types
Returns the data type with the highest precedence from the set of types passed to the function

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create table #t(c varchar(100), d date)


insert #t(c, d)
select 'blalba', getdate()


select choose(1, c, d) from #t
...
Рейтинг: 0 / 0
18.02.2021, 14:42
    #40046697
ol_chig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
msLex
HornetBlack
ol_chig,

[/src]

хотя если сделать так
Код: sql
1.
select choose(2, cast(c as varchar(max)), cast(d as varchar(max))) from #t


то что-то можно будет сделать, нужно учесть формат каждого поля и написать правильный конверт. Опять же костыль обретает вселенский масштаб в скобках choose и если каждый из 700 полей переводить в varchar, то на сколько быстро это все будет работать?
...
Рейтинг: 0 / 0
18.02.2021, 14:48
    #40046708
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли альтернатива динамическому запросу внутри функции?
ol_chig,


тогда уж лучше sql_variant, хотя бы сохранятся данные об исходном типе

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table #t(c varchar(100), d date)


insert #t(c, d)
select 'blalba', getdate()

; with a as (
select	
	c = choose(1, cast(c as sql_variant), cast(d as sql_variant)) 
	, d = choose(2, cast(c as sql_variant), cast(d as sql_variant)) 
from #t
)
select 
	c
	, d
	, sql_variant_property (c, 'BaseType')
	, sql_variant_property (d, 'BaseType')
from a

drop table #t
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Есть ли альтернатива динамическому запросу внутри функции? / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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