Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Функция, модифицирующая результат DSQL'я  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
create function SmthFunc (@id bigint, @MasterTable nvarchar(32), @DetailTable nvarchar(32))
returns nvarchar(2000)
as
begin
  declare
    @cmd nvarchar(2000),
    @prm nvarchar(2000),
    @result nvarchar(2000)

  declare
    @t table(id bigint)

  set @cmd=N'select a.dest_id from '+@DetailTable+N' a where a.source_id = (select b.mi_data_id from '+@MasterTable+N' b where b.id = @id_)'
  set @prm=N'@id_ bigint'
  insert into @t exec sp_executesql @cmd, @prm, @id_=@id
  select @result=stuff((select ','+convert(nvarchar(2000),id) from @t for xml path('')),1,1,'')

  return @result
end

Invalid use of a side-effecting operator 'INSERT EXEC' within a function.

Перекрутил на времянку: Cannot access temporary tables from within a function.

Попробовал передать @t в др функцию - тоже болт с левой резьбой: create function gather_str (@t table(id bigint)) - Incorrect syntax near the keyword 'table'.

Как забороть?

select @@version
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


/me думает: и зачем нужно было эти table-valued функции, если с ними ничего сделать нельзя?..
_________________
"Helo, word!" - 17 errors 56 warnings
16 июл 12, 15:51    [12873155]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
invm
Member

Откуда: Москва
Сообщений: 9780
В функциях запрещен DSQL в любом виде. Аминь.
16 июл 12, 15:59    [12873211]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
invm
В функциях запрещен DSQL в любом виде. Аминь.
Ну, не так категорично.
В остальном присоединяюсь.
Не буду учить плохому.
16 июл 12, 16:01    [12873224]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Научите хорошему. Нужна функция, возвращающая id'шки в виде string'а через запятую по выше указанным входным параметрам. Как реализовать?
16 июл 12, 16:10    [12873261]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37254
Ex_Soft
Научите хорошему. Нужна функция, возвращающая id'шки в виде string'а через запятую по выше указанным входным параметрам. Как реализовать?
Напишите процедуру. Функция-то зачем?
16 июл 12, 16:17    [12873305]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Ex_Soft
Научите хорошему. Нужна функция, возвращающая id'шки в виде string'а через запятую по выше указанным входным параметрам. Как реализовать?
Процедуру не хотите?
Вообще, надо стараться избегать использования имён объектов базы данных для построения запросов.
Это делает неизбежным применения DSQL.

Тем более, можно же динамически генерировать статический запрос на клиенте?
16 июл 12, 16:17    [12873307]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1935
Ex_Soft,

Возвращать значения могут не только функции, но и процедуры.
Используйте OUTPUT-параметры.


Либо можно присваивать переменной итог выполнения процедуры.
16 июл 12, 16:17    [12873311]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Гавриленко Сергей Алексеевич
Функция-то зачем?
Такая постановка задачи. Первоисточник - Оракул. Там - функция. Соответственно везде идет select * from SmthFunc().
16 июл 12, 16:20    [12873329]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
DaniilSeryi
Ex_Soft,

Возвращать значения могут не только функции, но и процедуры.
Используйте OUTPUT-параметры.


Либо можно присваивать переменной итог выполнения процедуры.
Это как?!
Целой переменной присвоить список айдишников через запятую!
16 июл 12, 16:20    [12873330]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Ex_Soft
Попробовал передать @t в др функцию - тоже болт с левой резьбой: create function gather_str (@t table(id bigint)) - Incorrect syntax near the keyword 'table'.

Как забороть?

/me думает: и зачем нужно было эти table-valued функции, если с ними ничего сделать нельзя?..
Для начала надо почитать о синтаксисе создания и вызова функций с табличными параметрами.
А не выдумывать свой.
16 июл 12, 16:22    [12873339]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37254
Ex_Soft
Гавриленко Сергей Алексеевич
Функция-то зачем?
Такая постановка задачи. Первоисточник - Оракул. Там - функция. Соответственно везде идет select * from SmthFunc().
Не все вещи могут быть перенесены напрямую с других СУБД.
16 июл 12, 16:24    [12873345]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1935
iap
DaniilSeryi
Ex_Soft,

Возвращать значения могут не только функции, но и процедуры.
Используйте OUTPUT-параметры.


Либо можно присваивать переменной итог выполнения процедуры.
Это как?!
Целой переменной присвоить список айдишников через запятую!


Шутим?
Вот хороший пример, как переменная получает вывод из процедуры.

http://www.rsdn.ru/forum/db/2569318.flat.aspx
16 июл 12, 16:26    [12873357]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Ex_Soft
Научите хорошему. Нужна функция, возвращающая id'шки в виде string'а через запятую по выше указанным входным параметрам. Как реализовать?


значения @MasterTable и @DeatailTable абсолютно непредсказуемы или же являются элементами некоего более-менее постоянного списка? если второе, то можно загнать этот список в таблицу и на основе этих данных генерить табличную функцию (или аналогичную вьюху, кому как нравится) с объединением сочетаний:

SELECT d1.dest_id, m1.id, 
FROM Detail1 d1
JOIN Master1 m1 ON m1.mi_data_id = d1.source_id
WHERE @DetailTable = 'Detail1' AND @MasterTable = 'Master1' AND m1.id = @id

UNION ALL

SELECT ..
FROM Detail2 ..
JOIN Master2 ..
...
16 июл 12, 16:27    [12873363]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Shakill
значения @MasterTable и @DeatailTable абсолютно непредсказуемы или же являются элементами некоего более-менее постоянного списка? если второе, то можно загнать этот список в таблицу
Никто заради M$ SQL'я ничего дополнительно в БД делать не будет.
16 июл 12, 16:38    [12873445]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Ex_Soft
Shakill
значения @MasterTable и @DeatailTable абсолютно непредсказуемы или же являются элементами некоего более-менее постоянного списка? если второе, то можно загнать этот список в таблицу
Никто заради M$ SQL'я ничего дополнительно в БД делать не будет.

как так, функцию же вы создаёте?
16 июл 12, 16:41    [12873463]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
DaniilSeryi
iap
пропущено...
Это как?!
Целой переменной присвоить список айдишников через запятую!


Шутим?
Вот хороший пример, как переменная получает вывод из процедуры.

http://www.rsdn.ru/forum/db/2569318.flat.aspx
Почему шучу?
Процедуры возвращают результат типа INT.
Для всего прочего - параметры OUTPUT. Но про них Вы же отдельно уже написали?
16 июл 12, 16:42    [12873475]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Ex_Soft
Никто заради M$ SQL'я ничего дополнительно в БД делать не будет.
16 июл 12, 16:43    [12873483]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
iap
Процедуры возвращают результат типа INT.

1.
Ex_Soft
Нужна функция, возвращающая id'шки в виде [b]string[b]'а через запятую по выше указанным входным параметрам.

2.
Ex_Soft
Соответственно везде идет select * from SmthFunc().
16 июл 12, 16:46    [12873499]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Ex_Soft
Ex_Soft
Никто заради M$ SQL'я ничего дополнительно в БД делать не будет.

так вы не ответили на вопрос про статичность набора имен таблиц. если он статичен, то можно этот UNION ALL прописать в самой функции и всё, никаких "дополнительно"
16 июл 12, 16:46    [12873502]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1935
iap
DaniilSeryi
пропущено...


Шутим?
Вот хороший пример, как переменная получает вывод из процедуры.

http://www.rsdn.ru/forum/db/2569318.flat.aspx
Почему шучу?
Процедуры возвращают результат типа INT.
Для всего прочего - параметры OUTPUT. Но про них Вы же отдельно уже написали?


Неверно выразился. Если в процедуре есть Select, выводящий какие-то значения или таблицу (набор полей), то итог вывода этого Select-a можно присвоить переменной скалярного или табличного типа, в зависимости от типа выводимого Select-ом результата.
Ни к OUTPUT-параметрам процедуры, ни к возвращаемому процедурами результату типа INT это отношения не имеет.
Имхо, похоже на получение итогов выполнения DSQL-кода:

DECLARE @table_variable table (inn nvarchar(10), name nvarchar(200))
insert @table_variable exec Procedure_name param1, ..., paramN
select * from @table_variable

Другой вопрос, что если Select-ов внутри процедуры несколько, то получите ошибку.
16 июл 12, 17:01    [12873601]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Ex_Soft
Shakill
значения @MasterTable и @DeatailTable абсолютно непредсказуемы или же являются элементами некоего более-менее постоянного списка? если второе, то можно загнать этот список в таблицу
Никто заради M$ SQL'я ничего дополнительно в БД делать не будет.
Раз Вы, бедняга, так MSSQL презираете и всё равно мучаетесь,
то я Вас научу-таки плохому!

Ключевые слова - ESP и CLR!

Их можно вызывать из функции...
16 июл 12, 17:11    [12873642]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
DaniilSeryi
Неверно выразился. Если в процедуре есть Select, выводящий какие-то значения или таблицу (набор полей), то итог вывода этого Select-a можно присвоить переменной скалярного типа.
Вы опять неверно выразились или покажете?
16 июл 12, 17:13    [12873653]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
Shakill
так вы не ответили на вопрос про статичность набора имен таблиц. если он статичен

Нет - не статичен
16 июл 12, 17:24    [12873729]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
iap
Ключевые слова - ESP и CLR!

Других альтернатив , я так понял, нет?
16 июл 12, 17:28    [12873744]     Ответить | Цитировать Сообщить модератору
 Re: Функция, модифицирующая результат DSQL'я  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1935
iap,

Глазки протираем, а мои слова не перевираем.
Написано было "скалярного или табличного типа"
Для случая вывода таблицы пример кода был приведен внизу.
На этом дискуссию закрываю.
16 июл 12, 17:38    [12873797]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить