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

Откуда:
Сообщений: 36
declare @voc1 table (id int, name varchar(32))
insert into @voc1
values (1, 'хрень какая-то')
select *
from @voc1

declare @voc2 table (id int, name varchar(32))
insert into @voc2
values (2, 'нанодвижитель')
select *
from @voc2


declare @t table (id int, tname varchar(32))
insert into @t
values (1, '@voc1')
insert into @t
values (2, '@voc2')
select *
from @t

итак:
@voc1 - первый справочник
@voc2 - второй справочник
@t - таблица, содержащая id записей или из 1-ого или из 2-ого справочника и поле (tname) определяющее в каком именно справочнике хранится этот id
нужен запрос, который вытащит id из @t и соответствующий name из соответствующего справочника.
Что-то я совсем торможу и ничего в голову не идет... подскажите, други, как сие реализовать?
MSSQL 2005, если что...
11 июл 11, 17:29    [10957353]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
aleks2
Guest
select *
from @t T inner join
(select id, name, '@voc1' tname FROM @voc1
 UNION ALL
 select id, name, '@voc2' tname FROM @voc2 
 ) X
 ON X.tname=T.tname AND X.id=T.id

Тока это действительно хрень. Особенно хрень - так проектировать базу.
11 июл 11, 17:41    [10957420]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
use tempdb

create table #voc1(id int, name varchar(32))
insert into #voc1
values (1, 'хрень какая-то')
select *
from #voc1

create table #voc2(id int, name varchar(32))
insert into #voc2
values (2, 'нанодвижитель')
select *
from #voc2


create table #t (id int, tname varchar(32))
insert into #t
values (1, '#voc1')
insert into #t
values (2, '#voc2')
select *
from #t

declare @s_id int
declare @s_name varchar(32)
declare @cmd nvarchar(4000)

create table #result (id int, name varchar(32))

DECLARE tmp_cursor  CURSOR static local FOR 
	SELECT	id,tname
	FROM #t

OPEN tmp_cursor

FETCH NEXT FROM tmp_cursor INTO @s_id,@s_name

WHILE (@@FETCH_STATUS <> -1)
  BEGIN  
	set @cmd = N'insert into #result(id,name) select id, name from ' + @s_name + ' where id=' + cast(@s_id as varchar)
	exec sp_executesql @cmd
	FETCH NEXT FROM tmp_cursor INTO @s_id,@s_name
  end

close tmp_cursor
deallocate tmp_cursor
select * from #result

drop table #voc1
drop table #voc2
drop table #t
drop table #result

Как-то так
11 июл 11, 17:51    [10957470]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
aleks2
... Особенно хрень - так проектировать базу.


Увы, например, когда нужно вытащить значения субконто из таблицы проводок в удобоваримом виде для 1с (что 7.7, что 8) приходится извращаться (я как правило иду по пути курсоров временных таблиц и динамического SQL).
11 июл 11, 19:07    [10957950]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
Монгол*
Guest
извиняюсь, но кажись мало вводных и из-за этого не совсем правильно понята задача...

aleks2
select *
from @t T inner join
(select id, name, '@voc1' tname FROM @voc1
 UNION ALL
 select id, name, '@voc2' tname FROM @voc2 
 ) X
 ON X.tname=T.tname AND X.id=T.id

Тока это действительно хрень. Особенно хрень - так проектировать базу.


количество справочников не определенно.
я привел упрощенный пример

по проектированию... Вы же, aleks2 не знаете всего проекта и всей структуры БД, посему по одному, очень упрощенному вопросу, не следует делать выводы.
11 июл 11, 22:12    [10958471]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
Монгол*
Guest
Шыфл
use tempdb
......

Как-то так


курсоры, конечно же, исключаются
понятно, что динамика не лучше, но решение через курсор - это уже в последнюю очередь
11 июл 11, 22:15    [10958482]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
aleks2
Guest
Монгол*
я привел упрощенный пример

по проектированию... Вы же, aleks2 не знаете всего проекта и всей структуры БД, посему по одному, очень упрощенному вопросу, не следует делать выводы.

1. Дьявол скрывается в мелких деталях.
2. По-крупному, я, просто, боюсь представить, шо вы там наворотили...
3. Даже если справочников многа - выбора у вас мало.
4. Partitioned View
https://www.sql.ru/forum/actualthread.aspx?tid=865490
12 июл 11, 08:27    [10959470]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
aleks2
Guest
пардон, ссылочка не та...
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_1devconc/html/ba7a317b-7b42-49ea-a1c7-ba8e77daa51f.htm
12 июл 11, 08:29    [10959473]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
Монгол*
по проектированию...

если справочники однотипны - засунуть в один с доп колонкой - № Справочника
12 июл 11, 12:20    [10960760]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
Монгол
Member

Откуда:
Сообщений: 36
Ivan Durak
если справочники однотипны - засунуть в один с доп колонкой - № Справочника

нет, не однотипны
и интересно решение именно в рамках поставленной задачи
структура баз не пересматривается, курсоры малоинтересны, клиентское приложение не переписывается
мне сперва показалось, что динамикой я ща за пару минут напишу... ан нет, при ближайшем рассмотрении оказалось, что не срастается.
и в данные момент интересует один вопрос - возможно ли решение простым запросом, пусть и динамическим? Или таки ваять процедуру с циклами-курсорами?
12 июл 11, 13:21    [10961197]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
Монгол
Member

Откуда:
Сообщений: 36
aleks2
1. Дьявол скрывается в мелких деталях.

да, но таки это можно, скорее, отнести к не содержательной части любой дискуссии.
2. По-крупному, я, просто, боюсь представить, шо вы там наворотили...

ага, самому бывает страшно... критиков у системы хватает и я в их числе.
3. Даже если справочников многа - выбора у вас мало.

хотел убедиться... вдруг глаз замылился и не вижу простого решения.
4.Partitioned View

вероятно... но просто это решение не такое универсальное, как хотелось бы.
12 июл 11, 13:30    [10961270]     Ответить | Цитировать Сообщить модератору
 Re: хитрая динамика (?)  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Монгол,

Тут либо шашечки, либо ехать...

Либо рисуй Maping tables на свои справочники, чтобы всё было единобразно, либо обрабатывай их по очереди...
12 июл 11, 13:46    [10961370]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить