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

Откуда:
Сообщений: 272
есть две таблицы - Contracts, Volumes.
В таблице Contracts первичный ключ Id.
В таблице Volumes первичный ключ Contact ( ид. контракта ) + Pole2.
Отношения один ко многим.

Задача такая : Выбрана таблица Contracts и надо из базы выбрать те таблице, у которой первичный ключ включает в себя идентификатор другой таблицы.

Народ, помогите пожалуйста.
19 окт 13, 14:50    [15002170]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
mag2000
Member

Откуда:
Сообщений: 182
Tanya_0306,
Примерно так ?
SELECT  
    fk.name,
    OBJECT_NAME(fk.parent_object_id) 'Child table'
FROM 
    sys.foreign_keys fk
WHERE
    fk.referenced_object_id = OBJECT_ID('Имя_вашей_таблицы')
19 окт 13, 18:00    [15002491]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3376
Tanya_0306
у которой первичный ключ включает в себя идентификатор другой таблицы.
Полностью включает, или хотя бы один столбец?

Там немного по-разному писать придется, в зависимости от.
19 окт 13, 19:40    [15002808]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Tanya_0306
Member

Откуда:
Сообщений: 272
Ennor Tiegael,

полностью включает идентификатор.
Т.е
Таблица Contract идентификатор - Id
Таблица Volumes - идентификатор Contract (Id таблицы Contract) Volum.
19 окт 13, 19:48    [15002839]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Tanya_0306
Member

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

Проверяю на двух таблицах (схему в файле прикрепила)
Результат для таблице Waybills ( выдает правильный - у нее одна подчиненная таблица Bills.
А для другой таблицы Contract ожидаю Volumes и Qualities, но почему еще выдается Waybills???

К сообщению приложен файл. Размер - 83Kb
19 окт 13, 19:55    [15002863]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Ennor Tiegael
Member

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

select object_name(sq.object_id) as [ChildTable], object_name(sq.referenced_object_id) as [ParentTable]
from (
	select i.object_id, fk.referenced_object_id
	from sys.indexes i
		inner join sys.index_columns ic on i.object_id = ic.object_id and i.index_id = ic.index_id
		inner join sys.foreign_keys fk on i.object_id = fk.parent_object_id
		left join sys.foreign_key_columns kc on fk.object_id = kc.constraint_object_id
			and ic.column_id = kc.parent_column_id
	where kc.parent_object_id != kc.referenced_object_id
		and i.is_primary_key = 1
	group by i.object_id, fk.referenced_object_id
	having count(kc.parent_column_id) <= count(ic.column_id)
	) sq;
Но если честно, не уверен, что будет покрывать прямо вот все случаи. Потестите как следует.
19 окт 13, 20:40    [15002991]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Tanya_0306
Member

Откуда:
Сообщений: 272
Ennor Tiegael,

СПАСИБО!!!!!!!!!!!!!!!!!!
РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!
у меня пока два случая - их точно покрывает, база будет расти, буду тестить.
19 окт 13, 20:45    [15002999]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Tanya_0306
Member

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

Эх, рано обрадовалась ... Таблиц добавила, проблем прибавилось )
19 окт 13, 21:15    [15003070]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Tanya_0306
Member

Откуда:
Сообщений: 272
Ennor Tiegael,

Все вроде логично.
Но почему-то выдается выдаются "лишние" таблицы Nomenclature и Currency.
Может я чего то не правильно спроектировала?
Суть такова :
Контракт - по нему
1. задаются объемы (Volumes) в разрезе номенклатуры. Первичный ключ = контракт(ид.контракта) + номенклатура(ид. таблицы номенклатуры ))
2.задается качество (Qualities) в разрезе номенклатуры и параметра. Первичный ключ = контракт(ид.контракта) + номенклатура(ид. таблицы номенклатуры )) + параметр качества (ид.таблицы Качество)

С таблицей Waybills запрос сработал идеально, никаких лишних данных не выдал.

К сообщению приложен файл. Размер - 68Kb
19 окт 13, 21:40    [15003162]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Ennor Tiegael
Member

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

Данный запрос работает совершенно независимо от того, насколько хорошо у вас спроектирована база. Он просто возвращает вхождение столбцов FK в дочерний PK.

На самом деле, там есть один косяк, неправильно размер PK считается. Видимо, надо в подзапрос выделять...
20 окт 13, 08:39    [15003915]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3376
select object_name(sq.object_id) as [ChildTable], object_name(sq.referenced_object_id) as [ParentTable],
	sq.PK_Size, sq.FK_Size
from (
	select isq.object_id, fk.referenced_object_id, isq.PK_Size, count(kc.parent_column_id) as [FK_Size]
	from (
		select i.object_id, ic.column_id, count(*) over(partition by i.object_id) as [PK_Size]
		from sys.indexes i
			inner join sys.index_columns ic on i.object_id = ic.object_id and i.index_id = ic.index_id
		where i.is_primary_key = 1
		) isq
		inner join sys.foreign_keys fk on isq.object_id = fk.parent_object_id
		left join sys.foreign_key_columns kc on fk.object_id = kc.constraint_object_id
			and isq.column_id = kc.parent_column_id
	where kc.parent_object_id != kc.referenced_object_id
	group by isq.object_id, fk.referenced_object_id, isq.PK_Size
	having count(kc.parent_column_id) <= isq.PK_Size
	) sq
order by ChildTable, ParentTable;
Мне только одно непонятно, зачем вам это все? Какую задачу решаете?
20 окт 13, 09:22    [15003919]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Tanya_0306
Member

Откуда:
Сообщений: 272
Ennor Tiegael,

Если в двух словах - обмен информацией между базами данных SQL server и 1С. Такую задачу мне поставили (что-то типа конвертации данных если знакомо из 1с)
Причем таблицы имеют разные названия и структуру. Какая таблица в какую будет выгружаться и какие поля в какие - это я прописываю в отдельной таблице структура :
1. название структуры источника
2 таблица источник
3. поле таблицы источника
4 признак ключевого поля
5 название структуры приемника
6 таблица приемник
7 поле таблицы приемника

Таблицы имеют разное название, к примеру в SQL "Client" , на 1С - "Контрагенты", соответственно поля имеют разные названия. И еще главное отличие -в SQL "подчиненные таблицы", а в 1с это реализовано как "табличная часть".

Вот мне и надо выгрузить из SQL, но имена выгружаемой таблицы и полей "подменить" на имена соответствующей таблице 1С.

Для этого хочу сделать так:
В цикле на С# перебираю выбранные таблицы для выгрузки и
1. Определяю и записываю какие таблицы надо выгрузить до выбранной таблице (по внешним ключам, дабы не нарушать целостность)
2. Записываю таблицы выбранную
3. Определяю и записываю вложенные таблицы, относящиеся к выбранной.

Теоретически вот такой алгоритм ..... Кажется замороченный но другого на ум не идет .... Буду признательно за идею ).

К сообщению приложен файл. Размер - 6Kb
20 окт 13, 11:59    [15004076]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Ennor Tiegael
Member

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

Нет, я не знаю, что такое 1С и что такое "табличная часть". Думаю, вам лучше обратиться с этим вопросом в местный подфорум по 1С. Уверен, такая задача решалась до вас уже многократно, наверняка есть менее велосипедный способ.
20 окт 13, 12:08    [15004100]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Sergey Sizov
Member

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

И зачем тут C#?
1С сама может читать данные из SQL сервера без посредников используя ту же строку соединения, что используется и в C#.
20 окт 13, 18:43    [15004969]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Tanya_0306
Member

Откуда:
Сообщений: 272
Sergey Sizov,

Это автоматически происходит? К типовой конфигурации можно это привязать?
Идея один проект иметь в разных системах 1С и приложение написанное на Vusial Studio.
Вот мне дали проект на C# написать. А данные чтоб могла дать в 1с через xml файл. Если сталкивались - поделитесь идеями реализации
20 окт 13, 19:02    [15005009]     Ответить | Цитировать Сообщить модератору
 Re: Узнать имя подчиненной таблицы  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1566
Tanya_0306
Sergey Sizov,

Это автоматически происходит?
Если воспользоваться объектом конфигурации под названием Внешние данные, то автоматом. Если, конечно, под словом ЭТО Вы понимаете чтение данных из SQL сервера. В частности, при выборе таблицы фактов автоматом подтянуться и таблицы-справочники, если они привязаны форинкеями, то есть велосипед, который Вы тут изобретаете, уже давно сделан.
К типовой конфигурации можно это привязать?
Сколько угодно.
Идея один проект иметь в разных системах 1С и приложение написанное на Vusial Studio.
Вот мне дали проект на C# написать. А данные чтоб могла дать в 1с через xml файл.
И зачем файл?
Если сталкивались - поделитесь идеями реализации
У меня система состоит из приложения для ввода и первоначальной обработки первички c хранением на SQL сервере, а бухгалтерия и отчетность уже на 1С. Движение данных в обе стороны, преимущественно, конечно, в сторону 1с. Необходимость в сторонних приложениях и файлах для обеспечения связи ни разу не возникла.
Идеи просты до безобразия.
1. Внешний источник. Создаете и даже не зная Т-SQL пользуетесь для чтения чисто 1С средствами. Работает, если не ошибаюсь, с версии платформы 8.2.362. Ограничения - только чтение.
2. Старый добрый ADO. Подключаетесь, обычным T-SQL запросом выбираете/пишете нужные данные, дальше опять чистый 1С.
В обоих случаях нужна строка коннекта, такая же как в С#. Чтение и запись.
20 окт 13, 19:18    [15005026]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить