Передача в табличную переменную результатов EXEC

Darteus
Дата: 14.02.2013 20:38:16
есть функция, которая должна принимать в качестве аргумента имя таблицы, по отношению к которой будут производиться вычисления. функция в результате этих вычислений возвращает табличную переменную.
пример функции (вычисления упразднены):
create function func1 (@t varchar(255))
returns @res table (nn int)
as
begin
declare @sql varchar(255)
set @sql='select count(id) as nn from '+@t

insert into @res exec(@sql)
return
end

MSSQL ругается на конструкцию INSERT EXEC, говоря, что их использование вызывает побочное действие в функции.

Как быть?
qwerty112
Дата: 14.02.2013 20:46:54
Darteus,

у вас 2-а "пути" :
- подождать пока в функциях "разрешат" динамик скл
- переписать функцию / переделать на процедуру
Darteus
Дата: 14.02.2013 20:55:12
с процедурами в моем случае есть проблема. в последствии результат этой функции должен использоваться в SQL-запросе вида:
select * from TABLE1 where pole1 in (select pole1 from dbo.МОЯ_ФУНКЦИЯ)

А использовать в таком виде ПРОЦЕДУРУ сервер не хочет: говорит, что мол недопустимое имя объекта dbo.МОЯ_ПРОЦЕДУРА

Если подскажите, как его заставить это делать - сделаю все это ввиде процедур.
Cygapb-007
Дата: 14.02.2013 21:05:28
А почему нельзя использовать временные таблицы?
Владимир Затуливетер
Дата: 14.02.2013 21:10:09
Вычисления засунуть в функцию dbo.FnBaseCalc(param1, param2, ... paramN)
Написать для каждой таблицы отдельные функци в которых вызывать базовую dbo.FnBaseCalc
Если такое прокатит у вас.
invm
Дата: 14.02.2013 21:29:07
Если потребовалась функция с динамикой, значит, скорее всего, БД спроектирована с ошибками.
Darteus
Дата: 14.02.2013 21:31:32
Временные таблицы использовать не хочу, ибо обрабатываемые в базах данные исчисляются сотнями миллионов. Может я чего-то не знаю, но не думаю, что сервак будет в восторге от создания временной таблицы, которая в ходе работы будет заполняться таким количеством данных.

Идея написать для каждой таблицы отдельные функции рабочая, но очень не хотелось копи-пастить один и тот же код. Хотелось единое красивое решение, применимое ко всем базам (структура то у них одинаковая).
qwerty112
Дата: 14.02.2013 21:34:43
Darteus
Идея написать для каждой таблицы отдельные функции рабочая, но очень не хотелось копи-пастить один и тот же код. Хотелось единое красивое решение, применимое ко всем базам (структура то у них одинаковая).


"базами" - вы таблицы, конечно, называете, да ?

тогда вопрос :
- а зачем вам столько одинаковых по структуре "баз" ?
qwerty112
Дата: 14.02.2013 21:35:27
invm
Если потребовалась функция с динамикой, значит, скорее всего, БД спроектирована с ошибками.

+1
Darteus
Дата: 14.02.2013 21:48:12
Нет. задача именно с базами.

Есть база, в которой помимо данных должна быть эта процедура/функция. И есть несколько баз с однотипной информацией. Все базы на одном сервере.
В идеале хотелось бы чтобы эта процедура/функция в базе, вызывалась с параметром (параметр являет собой имя одной из тех баз с однотипной информацией) я бы получал некий результат вычислений, который потом можно было бы положить, например, в ту отдельную базу.
Но фишка в том, что эту процедуру/функцию надо вызывать не просто по имени, а указывая ее в стороннем sql-запросе, который использует ее результаты. И вот тут возникает заковырка, ибо таким макаром можно только функции вызывать.

Почему три базы с одинаковой структурой? Данные в них поступают из трех источников и данных этих сотни миллионов. Плюс к тому же есть задачи, которые надо решать отдельно для каждой базы (для каждого источника). Поэтому объединять их не будет правильным.