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

Откуда:
Сообщений: 126
Требуется функция которой планируется передавать имя таблицы, а она в свою очередь должна вывести эту таблицу полностью.
В стиле: SELECT * FROM dbo.func('TableName') должна вывести SELECT * FROM TableName
В будущем появится обработка WHERE и тп... Сейчас задача проста..

Пробую так:
CREATE FUNCTION [dbo].[func] (@tbl varchar(500))  
RETURNS table AS
RETURN (
	EXEC ( 'SELECT * FROM ' + @tbl )
)


Но увы ошибка, никак не могу найти в BOL синтаксис такого решения.
7 авг 12, 19:14    [12977345]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А его и нет. Планируйте по-другому.
7 авг 12, 19:17    [12977360]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Wrun
Member [заблокирован]

Откуда:
Сообщений: 126
Т.е. в принципе невозможно динамически имя подставить таблице?
7 авг 12, 19:21    [12977382]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Wrun
Т.е. в принципе невозможно динамически имя подставить таблице?
Можно. Но не в функции.
7 авг 12, 19:23    [12977390]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Wrun
Member [заблокирован]

Откуда:
Сообщений: 126
Ну т.е. в процедуре... Мне бы нужно на лету, Ф-ция или View
7 авг 12, 19:24    [12977396]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Wrun
Ну т.е. в процедуре... Мне бы нужно на лету, Ф-ция или View
Нельзя в функциях или view использовать динамику. Аминь.
7 авг 12, 19:27    [12977409]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Гавриленко Сергей Алексеевич
Wrun
Т.е. в принципе невозможно динамически имя подставить таблице?
Можно. Но не в функции.
Можно написать CLR-функцию, которая принимает аргументом имя таблицы (или даже SQL-запрос на выборку), выберет записи и вернёт их как таблицу. Но структура этой таблицы должна быть статической.
7 авг 12, 20:12    [12977580]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Wrun,

Вы идёте по НЕ правильному пути. Не делайте так.
Если сможете объяснить "зачем вам это" я попробую попочь.
7 авг 12, 20:58    [12977727]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
lbppb
Member

Откуда:
Сообщений: 1049
Ну раз имя таблицы известно, то чего мудрить-то, не проще ли так и написать
SELECT * FROM tblName
ну и WHERE потом? Функция для чего нужна? И точно ли нужна?
7 авг 12, 22:15    [12978086]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Serg_77m
Гавриленко Сергей Алексеевич
пропущено...
Можно. Но не в функции.
Можно написать CLR-функцию, которая принимает аргументом имя таблицы (или даже SQL-запрос на выборку), выберет записи и вернёт их как таблицу. Но структура этой таблицы должна быть статической.
Ага, только будет намного проще делать это сразу на клиенте.
7 авг 12, 23:35    [12978288]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Mind
Serg_77m
пропущено...
Можно написать CLR-функцию, которая принимает аргументом имя таблицы (или даже SQL-запрос на выборку), выберет записи и вернёт их как таблицу. Но структура этой таблицы должна быть статической.
Ага, только будет намного проще делать это сразу на клиенте.
Если больше с выбранной таблицей делать ничего не надо, тогда конечно, проще на клиенте. А если следом предполагается сложная обработка, тогда лучше на сервере... не закачивать же выбранную таблицу с клиента обратно на сервер? Хотя, всё равно, конечно, неудобно. Действительно, лучше поискать другое решение.
8 авг 12, 19:49    [12984185]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Wrun
Member [заблокирован]

Откуда:
Сообщений: 126
Ссори, думал что верный и простой путь, не описал полную задачу..

Всё происходит на сервере (Job`ы)

Задача такая, Есть около 20-30 таблиц, с исходной информацией...
Некоторое (увеличивающееся) кол-во систем обращаются к данной информации, некоторым нужна PRE обработка, дельта, некоторым достаточно прямых View. Но у всех есть одно общее - Их нужно ограничивать по одному полю (GRP).
Т.е. Для Получатель1 доступно GRP in (01,02), для Получатель2 - GRP in (01,03) и тд...
Вся инфа есть в таблице config Получатель=>GRPs
Вот и пришла идея создать прослойку в виде одной функции - в которую скармливать ИмяТаблицы и Получателя а она уже вернет что следует. Можно конечно наделать кучу View, ну или как решение сделать ф-ций столько же сколько таблиц... Но пока не хочется плодить объекты...
8 авг 12, 19:58    [12984220]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Wrun
Ссори, думал что верный и простой путь, не описал полную задачу..

Всё происходит на сервере (Job`ы)

Задача такая, Есть около 20-30 таблиц, с исходной информацией...
Некоторое (увеличивающееся) кол-во систем обращаются к данной информации, некоторым нужна PRE обработка, дельта, некоторым достаточно прямых View. Но у всех есть одно общее - Их нужно ограничивать по одному полю (GRP).
Т.е. Для Получатель1 доступно GRP in (01,02), для Получатель2 - GRP in (01,03) и тд...
Вся инфа есть в таблице config Получатель=>GRPs
Вот и пришла идея создать прослойку в виде одной функции - в которую скармливать ИмяТаблицы и Получателя а она уже вернет что следует. Можно конечно наделать кучу View, ну или как решение сделать ф-ций столько же сколько таблиц... Но пока не хочется плодить объекты...
Плодить объекты - это создать по 1му view на каждую таблицу?
8 авг 12, 20:19    [12984287]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Wrun
Ссори, думал что верный и простой путь, не описал полную задачу..

Всё происходит на сервере (Job`ы)

Задача такая, Есть около 20-30 таблиц, с исходной информацией...
Некоторое (увеличивающееся) кол-во систем обращаются к данной информации, некоторым нужна PRE обработка, дельта, некоторым достаточно прямых View. Но у всех есть одно общее - Их нужно ограничивать по одному полю (GRP).
Т.е. Для Получатель1 доступно GRP in (01,02), для Получатель2 - GRP in (01,03) и тд...
Вся инфа есть в таблице config Получатель=>GRPs
Вот и пришла идея создать прослойку в виде одной функции - в которую скармливать ИмяТаблицы и Получателя а она уже вернет что следует. Можно конечно наделать кучу View, ну или как решение сделать ф-ций столько же сколько таблиц... Но пока не хочется плодить объекты...
По-моему, надо добавить таблицу доступа. Из двух полей: Получатель, и доступный ему GRP. Если получателю доступно несколько GRP, то соответственно будет несколько записей. И вместо "GRP in (01,02)" писать "GRP in (select GRP from ТаблицаДоступа where Получатель=@такой_то)". Ну или inner join'ом соединить.
8 авг 12, 20:31    [12984325]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Wrun
Member [заблокирован]

Откуда:
Сообщений: 126
Mind
Плодить объекты - это создать по 1му view на каждую таблицу?


Ну да, потому что для каждой системы нужно будет обращаться почти ко всем таблицам, а значит нужно 20-30 View умножить на кол-во систем...

Я уже думал о варианте прикрутить Config во View, и ограничится кол-вом таблиц, т.е. одно View на 1 таблицу... С таким же успехом можно создать и ф-ции 1 ко 1 с кол-вом таблиц... Эти решения понятны, хотелось более универсальное решение, т.к. БД растет и потом всё это нужно будет вести
8 авг 12, 20:39    [12984346]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Wrun
Ну да, потому что для каждой системы нужно будет обращаться почти ко всем таблицам, а значит нужно 20-30 View умножить на кол-во систем...
Мне кажется что архитектура/подход не ахти.
Таблицы структурно разные? Структура данных из этой func одинаковая?
Данные для разных "систем" независимые?

Можно и одну функцию для каждой таблы, с параметрами (тип, система). Или JOIN на какую-то управляющую VIEW.

А если там шаблон, то можно динамикой (на Event, изменение схемы) представление/функцию создавать/дропать.

Динамика зло. В любых системах, подходах, языках и платформах. Т.е. это не то что скуль не позволяет, это реально неправильно так делать.
Да иногда сгенерить знуля проще и эффективнее, чем подготовить всё заранее. Но это не так часто. И точно не в данном случае.
К примеру те же виртуальные машины исполния (аля .Net (CLR)) быстры именно из-за того что рантайм вычисления и последовательности преобразуют на уровень компайл, готовя всё заранее, "вынося за скобки".
9 авг 12, 12:13    [12986749]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
lbppb
Member

Откуда:
Сообщений: 1049
Если подойдет процедура вместо функции, то можно так:

create procedure dbo.spTable (@tbl varchar (500))
as
exec('select * from ' + @tbl )
12 авг 12, 17:44    [13000575]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Wrun,

CREATE  FUNCTION [dbo].[f_test] 
(@p AS  INT )
RETURNS @ReturnTable TABLE 
	(dID INT
	,btext varchar(max))
AS
BEGIN

IF @p =1 
INSERT INTO @ReturnTable
SELECT field_01, field_02 FROM tab_a 

IF  @p =2 
INSERT INTO @ReturnTable
SELECT field_01, field_02 FROM tab_b 

-- и т.д.

RETURN
END

GO

SELECT * FROM f_test(1)
SELECT * FROM f_test(2)
12 авг 12, 18:09    [13000624]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
trew,

ну зачем вы такие советы даёте, о последствия представляете если её использовать и главное "зачем" ?!
13 авг 12, 10:21    [13002471]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
NIIIK
trew,
ну зачем вы такие советы даёте, о последствия представляете если её использовать и главное "зачем" ?!
Согласен, не раз, но не у каждого есть "ген ответственности". Более того у большинства его нет.

trew, Бритва Оккама необходимое чувство каждого прогера.
13 авг 12, 13:19    [13003558]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
Mnior
Бритва Оккама необходимое чувство каждого прогера.
[offtop]мусье не использует временных таблиц? конфигурация без лишних сущностей не всегда есть "лучшая", имхо.[offtop]
13 авг 12, 14:07    [13003893]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Дедушка
[offtop]конфигурация без лишних сущностей не всегда есть "лучшая", имхо.[offtop]
Не плодите сущностей понапрасну.
Дедушка
мусье не использует временных таблиц?
Максимально возможно.
13 авг 12, 15:06    [13004394]     Ответить | Цитировать Сообщить модератору
 Re: Функция возвращающая целиком таблицу  [new]
Wrun
Member [заблокирован]

Откуда:
Сообщений: 126
Благодарю всех за дискуссию!

Вариант с процедурой увы не удобен, т.к. нужно многочисленое обращение к этим объектам

Вариант с функцией стандартного набора полей - тоже не возможен - таблицы очень различны.

Выбран путь создать для каждой таблицы с данными свою ф-цию в которую будет передаваться параметр Запрашиваемой Системы, а внутри функции будет накладываться условие.

Пример:
select * from dbo.Ftable1('system1')

внутри ф-ции
...
select * from table1 where del=Null and GRP in (select value from config(@system))

И так для каждой таблицы...

Решение в принципе приемлимое, просто хотелось вести одну такую функцию, а не 20...
13 авг 12, 23:41    [13006664]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить