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

Откуда:
Сообщений: 9
При решении задачи переноса дынных из СУБД MSSQL server 2000 в 1С столкнулся с задачей:
Если таблица А, в ее поле а1 содержится ссылка на запись из таблицы Б.
Вопрос : Каким образом узнать название таблицы Б и название поля, по которому делается связка?

Буду благодарен за любой ответ по существу, брошенной ссылке и т.д.
24 ноя 09, 13:23    [7970117]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Polifem
Member

Откуда:
Сообщений: 9
P.S. Имеется в виду неручной метод получения имени связанной таблицы: запросом, анализом данных и т.д
24 ноя 09, 13:31    [7970204]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Если таблица А, в ее поле а1 содержится ссылка на запись из таблицы Б.


если под "содержится ссылка" имеет ввиду FK, то sp_fkeys.
24 ноя 09, 14:15    [7970624]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1050
Polifem
При решении задачи переноса дынных из СУБД MSSQL server 2000 в 1С столкнулся с задачей:
Если таблица А, в ее поле а1 содержится ссылка на запись из таблицы Б.
Вопрос : Каким образом узнать название таблицы Б и название поля, по которому делается связка?

Буду благодарен за любой ответ по существу, брошенной ссылке и т.д.


Только не питайте иллюзий, что в базе 1С есть внешние ключи и ссылочная целостность на уровне сервера
24 ноя 09, 15:35    [7971350]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Polifem
Member

Откуда:
Сообщений: 9
VladimirKr


Только не питайте иллюзий, что в базе 1С есть внешние ключи и ссылочная целостность на уровне сервера


И близко нет. Мне просто надо выцедить из SQL данные, а в 1С я их соберу нужным образом.

pkarklin


если под "содержится ссылка" имеет ввиду FK, то sp_fkeys.


А можно чуть-чуть по подробней?
24 ноя 09, 16:13    [7971766]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
Если нет форинкеев (объектов таких), то от сервера вы про связи никак не узнаете. Потому что сервер сам про эти связи не знает.
24 ноя 09, 16:14    [7971779]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Supra93
Member

Откуда:
Сообщений: 8174
Polifem


А можно чуть-чуть по подробней?

sp_fkeys (Transact-SQL)
Но, по-моему 1с это до лампочки.
24 ноя 09, 16:17    [7971799]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
в 1с ПолучитьСтруктуруХраненияБазыДанных.
если конечно 1с 8.1...

для спящего время бодрствования равносильно сну
24 ноя 09, 16:26    [7971893]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Polifem


А можно чуть-чуть по подробней?


А что здесь непонятно?!

Сообщение было отредактировано: 24 ноя 09, 16:36
24 ноя 09, 16:30    [7971950]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Polifem
Member

Откуда:
Сообщений: 9
Supra93

sp_fkeys (Transact-SQL)
Но, по-моему 1с это до лампочки.

База, из которой делается выборка не имеет никакого отношения к 1С. Данные оттуда получаются путем передачи запроса и разборки результата.

pkarklin
Polifem


А можно чуть-чуть по подробней?


А что здесь непонятно?!


Извини, я не мастер SQL.
Непонятно следующее : sp_fkeys это вроде не таблица БД, соответственно выборка SELECT скорее всего не пройдет.
Просто я пока разобрался только как выполнить запрос типа SELECT, INSERT и т.д., с более сложными построениями пока не сталкивался.
24 ноя 09, 17:32    [7972522]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Polifem

Извини, я не мастер SQL.
Непонятно следующее : sp_fkeys это вроде не таблица БД, соответственно выборка SELECT скорее всего не пройдет.
Просто я пока разобрался только как выполнить запрос типа SELECT, INSERT и т.д., с более сложными построениями пока не сталкивался.

А вы на ссылу кликали ? Статью читали ? До раздела "Примеры использования" доходили ?
24 ноя 09, 17:34    [7972532]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Polifem
Member

Откуда:
Сообщений: 9
Glory
А вы на ссылу кликали ? Статью читали ? До раздела "Примеры использования" доходили ?

Хм. Может это странно, но по ссылке я прошел. И даже все прочитал.
Но поскольку мое знакомство с SQL Server, к моему большому сожалению, пока что самое базовое, я так и не понял: могу ли я в текст передаваемого запроса вставить вызов этой функции и какой примерно результат я получу?
24 ноя 09, 17:37    [7972558]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Polifem
Glory
А вы на ссылу кликали ? Статью читали ? До раздела "Примеры использования" доходили ?

Хм. Может это странно, но по ссылке я прошел. И даже все прочитал.
Но поскольку мое знакомство с SQL Server, к моему большому сожалению, пока что самое базовое, я так и не понял: могу ли я в текст передаваемого запроса вставить вызов этой функции и какой примерно результат я получу?

1. Это процедура, а не функция
2. Процедуры нельзя включать ни запросы.
3. Какой вам нужен запрос, если вы решаете задачу "Каким образом узнать название таблицы Б и название поля, по которому делается связка" ?
24 ноя 09, 17:40    [7972572]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Polifem
Member

Откуда:
Сообщений: 9
Glory
2. Процедуры нельзя включать ни запросы.

жаль :(
Glory
3. Какой вам нужен запрос, если вы решаете задачу "Каким образом узнать название таблицы Б и название поля, по которому делается связка" ?

Тут поподробней о задаче:
Если таблица, где хранятся записи о товарах. У товаров есть реквизиты(поля), которые являются ссылками на записи других таблиц. Например: "Производитель", "Страна изготовления", "Поставщик" и т.п.
При переносе информации о товарах также нужно переносить информацию о тех Поставщиках, Производителях и пр., которых нет в базе.

Вариант решения, который сейчас пытаюсь реализовать: передать в базу запрос типа SELECT для выборки данных из нужной таблицы. После этого проверить существование в базе объектов, на которые ссылаются загружаемые объекты. Если их нет, сделать соответствующий запрос в БД и т.д.

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

Насколько я понял, передать я могу только простейший запрос на SQL.
А для его составления нужно знать имя и структуру таблицы БД, откуда будем грузить данные.
Отсюда и вопрос: Каким образом узнать название таблицы Б и название поля, по которому делается связка? И можно ли это выяснить простейшими запросами?
24 ноя 09, 17:54    [7972698]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Polifem

Тут поподробней о задаче:
Если таблица, где хранятся записи о товарах. У товаров есть реквизиты(поля), которые являются ссылками на записи других таблиц. Например: "Производитель", "Страна изготовления", "Поставщик" и т.п.
При переносе информации о товарах также нужно переносить информацию о тех Поставщиках, Производителях и пр., которых нет в базе.

Логическое имя поля может говорить лишь о логической связи каких то объектов.
В физических же связях на стороне сервера участвуют названия физических полей и таблиц
Так что, если ваша 1С таки создает физические связи, то для их извлечения вам сначала придется выяснить как ваши логические "Товар", "Производитель", "Страна изготовления", "Поставщик" и тп отображаются в физические объекты
24 ноя 09, 18:01    [7972742]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
GlebZ
Member

Откуда: USA
Сообщений: 284
WITH TablesIerarhy (ftable,fkeyid, rTable,Level)
AS (


         SELECT DISTINCT OBJECT_NAME(a.fkeyid),a.fkeyid, OBJECT_NAME(a.fkeyid),1
         FROM sysreferences a
 	WHERE OBJECT_NAME(a.fkeyid) = 'BaseTableName'
	UNION ALL
        SELECT  OBJECT_NAME(a.fkeyid),a.fkeyid,  OBJECT_NAME(a.rkeyid),Level+1
        FROM sysreferences a
      INNER JOIN TablesIerarhy b  
	ON b.fkeyid = a.rkeyid AND OBJECT_NAME(a.fkeyid) !=OBJECT_NAME(a.rkeyid)
	)
SELECT * FROM TablesIerarhy
Водку? Водку - буду!
24 ноя 09, 18:15    [7972836]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
GlebZ
Member

Откуда: USA
Сообщений: 284
Оно-б, конечно, должно называтся TablesHierarhy, ну да фиг с ним.
:D
Водку? Водку - буду!
24 ноя 09, 18:17    [7972847]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Polifem
Member

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

Логическое имя поля может говорить лишь о логической связи каких то объектов.
В физических же связях на стороне сервера участвуют названия физических полей и таблиц
Так что, если ваша 1С таки создает физические связи, то для их извлечения вам сначала придется выяснить как ваши логические "Товар", "Производитель", "Страна изготовления", "Поставщик" и тп отображаются в физические объекты

К сожалению смысл данного высказывания понятен не до конца, но попробую ответить.
В выборке в полях "Поставщик", "Производитель" и т.п. мне выдет в виде строки уникальный код (uniqueidentifier) записи, на которую идет ссылка.
24 ноя 09, 18:21    [7972873]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Но поскольку мое знакомство с SQL Server, к моему большому сожалению, пока что самое базовое,


Интересно, а что ж Вы взялись за:

автор
Мне просто надо выцедить из SQL данные


???

автор
И даже все прочитал.


Угадал все буквы, но не угадал слово?! И даже примеры не помогли?

автор
Мне просто надо выцедить из SQL данные


Ну, держите, тогда, пример, на что ссылается (через FK) таблица Document:

sp_fkeys
  @fktable_name = 'Document'
24 ноя 09, 19:55    [7973165]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2Polifem
Вам на каком языке необходимо написать, что связи между таблицами 1с хранит в конфигурации? если хотите, эта конфигурация хранится в виде обычного архива без заголовка в таблице _Config.

для спящего время бодрствования равносильно сну
24 ноя 09, 20:51    [7973286]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Polifem
Member

Откуда:
Сообщений: 9
pkarklin
Интересно, а что ж Вы взялись за:???

К сожалению, пожелания нашего руководства не всегда совпадают с нашими собственными мыслями по поводу того, что нам делать.
Если у вас не так - то вам очень повезло.
Кроме того, с запросами как таковыми я знаком довольно хорошо. В той же самой 1С они используются часто и проблем с этим нет. Метод передачи запроса в систему SQL Server тоже вроде как нашел. Поэтому: "Почему бы не попробовать?"

pkarklin
Угадал все буквы, но не угадал слово?! И даже примеры не помогли?

Transact-SQL является языком программирования, в той или иной мере.
Разбираюсь с ним я от силы часа 3-4, поэтому я думаю позволительно пока кое-чего не знать.

Ну, держите, тогда, пример, на что ссылается (через FK) таблица Document:
sp_fkeys
  @fktable_name = 'Document'
[/quot]

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

[quot Алексей2003]2Polifem
Вам на каком языке необходимо написать, что связи между таблицами 1с хранит в конфигурации? если хотите, эта конфигурация хранится в виде обычного архива без заголовка в таблице _Config.

Большое спасибо за информацию, но, как я писал выше, БД не относится к 1С и никак с ней не связана. 1С в данном случае используется лишь как среда написания алгоритма обработки данных.
24 ноя 09, 21:16    [7973341]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
К сожалению, пожелания нашего руководства не всегда совпадают с нашими собственными мыслями по поводу того, что нам делать.
Если у вас не так - то вам очень повезло.


Спасибо! А Вам я могу только посочувствовать. Но если руководство говорит мне сделать что-то, в чем я абсолютно не разбираюсь, то я говорю, что я в этом не разбираюсь, и что задачу необходимо поручить специалисту в соответствующей области.

автор
Кроме того, с запросами как таковыми я знаком довольно хорошо. В той же самой 1С они используются часто и проблем с этим нет.


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

автор
Transact-SQL является языком программирования, в той или иной мере.
Разбираюсь с ним я от силы часа 3-4, поэтому я думаю позволительно пока кое-чего не знать.


Безусловно. Но, прочитав пример можно было еще и попытаться его выполнить на имеющейся бд.

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


Упаси Господь?! Откуда сарказм? Это реально работающий скрипт, который отвечает на поставленный вопрос:

автор
Если таблица А, в ее поле а1 содержится ссылка на запись из таблицы Б.
Вопрос : Каким образом узнать название таблицы Б и название поля, по которому делается связка?


В данном конкретном случае 'Document' = 'A'

ЗЫ. А по-поводу что и когда мне "держать при себе" я буду принимать решение сам.
24 ноя 09, 21:44    [7973397]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
Polifem
Member

Откуда:
Сообщений: 9
GlebZ
WITH TablesIerarhy (ftable,fkeyid, rTable,Level)
AS (
         SELECT DISTINCT OBJECT_NAME(a.fkeyid),a.fkeyid, OBJECT_NAME(a.fkeyid),1
         FROM sysreferences a
 	WHERE OBJECT_NAME(a.fkeyid) = 'BaseTableName'
	UNION ALL
        SELECT  OBJECT_NAME(a.fkeyid),a.fkeyid,  OBJECT_NAME(a.rkeyid),Level+1
        FROM sysreferences a
      INNER JOIN TablesIerarhy b  
	ON b.fkeyid = a.rkeyid AND OBJECT_NAME(a.fkeyid) !=OBJECT_NAME(a.rkeyid)
	)
SELECT * FROM TablesIerarhy
Водку? Водку - буду!

К сожалению выполнение данного скрипта не дало результатов (ругается на инструкцию WITH).
sp_fkeys
  @fktable_name = 'Document'
Дало нужный результат.
P.S.
pkarklin
Спасибо! А Вам я могу только посочувствовать. Но если руководство говорит мне сделать что-то, в чем я абсолютно не разбираюсь, то я говорю, что я в этом не разбираюсь, и что задачу необходимо поручить специалисту в соответствующей области.

Одно из свойств, за которое меня ценит руководство : я не отказываюсь от задачи сразу как только ее услышал. Я сначала пытаюсь ее решить доступными способами. Это, кстати, помогает увеличивать собственный "багаж знаний" и самосовершенствоватся. Как показало испытание, я могу передать не только "простой запрос", а и набор инструкций на Transact-SQL. Так что задание похоже несколько упрощается.
pkarklin
Безусловно. Но, прочитав пример можно было еще и попытаться его выполнить на имеющейся бд.

Как я писал раньше, ни одной БД в пределах досягаемости на тот момент небыло. Однако я провел тест как только это стало возможным.
pkarklin
ЗЫ. А по-поводу что и когда мне "держать при себе" я буду принимать решение сам.

Я лишь хотел сказать, что сарказм не уместен, поскольку я немог провести тест предложенного кода, и соответственно не имел веских аргументов как ЗА, так и ПРОТИВ вашей идеи.
25 ноя 09, 12:18    [7975599]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Polifem
Одно из свойств, за которое меня ценит руководство : я не отказываюсь от задачи сразу как только ее услышал. Я сначала пытаюсь ее решить доступными способами. Это, кстати, помогает увеличивать собственный "багаж знаний" и самосовершенствоватся.


Ну, если Ваше руководство, вместо того, чтобы поручить работу специалисту, готово тратить ресурсы и время на обучение не специалиста с неизвестным конечном результатом его работы, то я пас.

автор
Как я писал раньше, ни одной БД в пределах досягаемости на тот момент небыло. Однако я провел тест как только это стало возможным.


Но сообщаете об этом нам только сейчас. Мы то рассчитывали, что у Вас есть под рукой сервер с любой бд, хотя бы демонстрационной из комплекта поставки.

автор
Я лишь хотел сказать, что сарказм не уместен, поскольку я немог провести тест предложенного кода,


Еще раз обращаю Ваше внимание, что Вы притягиваете сарказм за уши.

автор
и соответственно не имел веских аргументов как ЗА, так и ПРОТИВ вашей идеи.


Еще раз обращаю Ваше внимание, что это не идея!
25 ноя 09, 13:09    [7976062]     Ответить | Цитировать Сообщить модератору
 Re: Имя связанной таблицы  [new]
GlebZ
Member

Откуда: USA
Сообщений: 284
Polifem


К сожалению выполнение данного скрипта не дало результатов (ругается на инструкцию WITH).

не обратил внимания, что 2000, sorry. Ну тогда структуру WITH надо развёртывать в temp table и в курсоре заполнять. Этим скриптом вы получите не только 1-й уровень связанных таблиц, но и последующие. Правда надо быть аккуратным с self reference.
25 ноя 09, 20:39    [7979146]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить