Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
RadChand
Member

Откуда:
Сообщений: 11
Есть куча справочников с обязательными столбцами ID int и Name varchar.
Пытаюсь написать UDF IdToName(@id int, @table varchar).

Перепробовал кучу способов, но безуспешно: то нельзя ХП из UDF вызывать, то динамические запросы он не понимает, то insert. Вчера 3 часа пропарился, так ничего и не достиг. Это вообще возможно хоть как-то?

Спасибо.
13 дек 04, 10:49    [1177207]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Это вообще возможно хоть как-то?
Что "это" ?
Из перечисленных вами - "то нельзя ХП из UDF вызывать, то динамические запросы он не понимает, то insert." - в UDF ничего реализовать нельзя.

Вчера 3 часа пропарился, так ничего и не достиг.
Достаточно было просто почитать в BOL про ограничения UDF-ов
13 дек 04, 10:52    [1177210]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
RadChand
Member

Откуда:
Сообщений: 11
[quot Glory]Это вообще возможно хоть как-то?
Что "это" ?
Из перечисленных вами - "то нельзя ХП из UDF вызывать, то динамические запросы он не понимает, то insert." - в UDF ничего реализовать нельзя.

Спасибо за столь содержательный ответ, но чего в UDF нельзя я уже понял.
Теперь меня интересует как обойти это "нельзя". А именно как написать UDF,
которая бы позволяла выбрать данные из заданной аргументом таблицы.
(Еще раз прочитайте первые две строчки моего вопроса.)

Я это сейчас сделал так:
create view IdToNameView as 
  select ID, Short_Name, 'Agent' as Tbl from Agent
  union
  select ID, Short_Name, 'Contragent' as Tbl from Contragent
  union
  ...
GO

create function IdToName( @id int, @table varchar(20) ) 
returns varchar(20)
as
begin
  declare @ret varchar(20)
  set @ret = (select Short_Name from IdToNameView where ID=@id and Tbl=@table)
  return @ret
end
GO

Но хотелось бы без создания дополнительной вьюшки.
13 дек 04, 11:33    [1177275]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
автор
Теперь меня интересует как обойти это "нельзя". А именно как написать UDF,
которая бы позволяла выбрать данные из заданной аргументом таблицы.

Никак, как бы несодержательно для Вас это ни звучало. By design.
автор
Я это сейчас сделал так:
Вернее, Вы сами ответили на свой вопрос.
13 дек 04, 11:43    [1177286]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
www.fun4me.narod.ru
Member

Откуда: Moscow
Сообщений: 2406
>> Но хотелось бы без создания дополнительной вьюшки.

Тогда if используйте. Их в UDF использовать можно.
13 дек 04, 11:44    [1177288]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Но хотелось бы без создания дополнительной вьюшки.
Тогда объединяйте все справочники в одну таблицу.
Если невозможно - тогда представление(только вместо union используйте union all).
Если невозможно - тогда на каждый справочник пишите свою UDF. Плюс UDF-обертку в которой через IF определяете какую из подфункций вызывать.
Если невозможно - тогда меняйте UDF на процедуру
Если невозможно - тогда формируйте текст запроса на клиенте
Если невозможно - тогда невозможно решить задачу.
13 дек 04, 11:46    [1177291]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
2 Glory

Еще есть вариант со своей DLL :) И оберткой в виде UDF :)
13 дек 04, 12:10    [1177325]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
RadChand
Member

Откуда:
Сообщений: 11
Вот теперь спасибо! Сразу куча ответов.

www.fun4me.narod.ru

Тогда if используйте. Их в UDF использовать можно.

Действительно! Чего-то я зациклился на запросах и до такого элементарного не допер.
Хотя при добавлении справочников придется переписывать ф-ю. Но все же так мне больше нравиться.

Гавриленко Сергей Алексеевич
Вернее, Вы сами ответили на свой вопрос.

Ага. Правда, решение нашел уже после того как задал вопрос.

Всем спасибо.
13 дек 04, 12:39    [1177371]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
me
Member

Откуда:
Сообщений: 76
Всем привет!

Это решение с IF - это единственный вариант?
А что делать если у меня "гениальная авторская разработка" где количесто таблиц которые могут фигурировать в запросе заранее неизвестно?

То есть, есть вьюха как у автора этого поста, но количество таблиц участвующих во вьюхе - может расти с ростом количества данных... то есть набралось определенное количество строк в таблице - создается новая таблица и данные пишутся уже в нее и т.д.

В итоге, я могу по ID точно узнать в какую из таблиц смотреть, но чтоб выдрать оттуда запись нужен диначиский скл. C IF это будет ветвление на 100 таблиц к примеру.

А если делать это в процедуре, то тоже уродливенько получается, потому как если у меня сет этих самых IDs, мне надо или в цикле или с курсором для каждой записи вызывать хранимку.

Может у кого есть более красивые варианты решения или мысли по поводу?
12 окт 11, 04:10    [11424241]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
me,
Вариант 1: перепроектировать все в нормальный вид.
Вариант 2: кодогенерация (если это возможно в вашей архитектуре).

* Мне лично нравится больше вариант №1.
12 окт 11, 08:42    [11424400]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
iljy
Member

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

честно говоря не уловил сути проблемы. Если у вас есть вьюха - так и выбирайте из нее, какая разница сколько в ней таблиц?
12 окт 11, 10:19    [11424711]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
me
Member

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

ну да, перепроектирование - это хорошо, и уже, слава богу, в планах... но не скоро
кодогенерация - мм... типа как .net функция... интересно, может попробую... но опыта с ними пока нет и вроде они не оч производительные тоже... но в принципе, вариант... спасибо
12 окт 11, 21:45    [11430112]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
me
Member

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

вьюха не эффективная, выборка из вьюхи приводит к поиску в каждой таблице - что не есть очень приятно...


вариантов особо нет, но иногда тут бывают оч оригинальные решения, вот я и на всякий случай уточняю...
12 окт 11, 21:59    [11430186]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
iljy
Member

Откуда:
Сообщений: 8711
me
iljy,

вьюха не эффективная, выборка из вьюхи приводит к поиску в каждой таблице - что не есть очень приятно...


вариантов особо нет, но иногда тут бывают оч оригинальные решения, вот я и на всякий случай уточняю...

Вы это видели на плане? Сделайте нормальное секционированное представление, будет эффективно.
12 окт 11, 22:43    [11430346]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iljy
вьюха не эффективная, выборка из вьюхи приводит к поиску в каждой таблице
Наивно.

iljy
Сделайте нормальное секционированное представление
Думаю до некоторых может плохо дойти, что для этого нужно практически ничего, а не какая-то там сложная мега переделка - "секционирования представления".
13 окт 11, 01:16    [11430850]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
iljy
Member

Откуда:
Сообщений: 8711
Mnior
iljy
Сделайте нормальное секционированное представление
Думаю до некоторых может плохо дойти, что для этого нужно практически ничего, а не какая-то там сложная мега переделка - "секционирования представления".

Все может быть, но это элементарно гуглится по ключевым словам. В конце концов можно и дополнительные вопросы задать.
13 окт 11, 09:25    [11431338]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iljy
Mnior
пропущено...
Думаю до некоторых может плохо дойти, что для этого нужно практически ничего, а не какая-то там сложная мега переделка - "секционирования представления".

Все может быть, но это элементарно гуглится по ключевым словам. В конце концов можно и дополнительные вопросы задать.
http://msdn.microsoft.com/ru-ru/library/ms190019(v=SQL.100).aspx
13 окт 11, 11:11    [11432060]     Ответить | Цитировать Сообщить модератору
 Re: Запарился с простейшей UDF IdToName(@id int, @table varchar)  [new]
me
Member

Откуда:
Сообщений: 76
да, partitioned view, было бы получше, но трогать вьюху на данный момент не разрешают.... если выбирать полезную колонку для check constraint, то нужны некоторые перемещения данных и так же манипуляции с логикой, которая эти данные распределяет по таблицам... не разрешают..

что касается неэффективности, то да, и план и статистика показывают гораздо больше ридов и всего остального, чем хотелось бы, и чем можно получить если запрашивать нужную табличку или хотя бы правильный partitioned view... на проблемы с вьюхой натыкались уже не один раз и более чем регулярно уже... это изначальный изьян "оригинального" дизайна, изменения в планах, но не оч скоро...

тем не менее, всем большое спасибо за советы...
как уже говорилось, на всякий случай проверить, нет ли каких новых решений и идей, никогда не повредит...
28 окт 11, 18:53    [11518457]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить