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

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

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

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

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

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

а) чтобы выполнить динамический запрос нужно запустить процедуру
Необязательно
...
Рейтинг: 0 / 0
Есть ли альтернатива динамическому запросу внутри функции?
    #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
Есть ли альтернатива динамическому запросу внутри функции?
    #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
Есть ли альтернатива динамическому запросу внутри функции?
    #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
Есть ли альтернатива динамическому запросу внутри функции?
    #40044485
ol_chig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Syrovatchenko, тем не менее спасибо за пример, возможно где-то пригодится
...
Рейтинг: 0 / 0
Есть ли альтернатива динамическому запросу внутри функции?
    #40044488
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ol_chig
Sergey Syrovatchenko, тем не менее спасибо за пример, возможно где-то пригодится


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

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

L_argo,

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

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

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

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

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

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

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

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

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

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


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

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


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