См вложение.
Данные sql-скрипты и Clr-функции (VS 2010, MS SQL Server 2008) предназначены для извлечения из 1Сv82 (MS SQL) данных об именах 1С для таблиц и столбцов БД MS SQL с использованием полнотекстового поиска. Предполагаемое использование : интеграция 1С. Не использует средства 1С.
О том, как устроены clr-функции и как их разворачивать на сервере см. http://msdn.microsoft.com/ru-ru/library/w2kae45k.aspx
В примере база 1С установлена в [Ad], а Clr развернуты в [Rig], но можно ставить их и вместе.
Искомые данные содержатся в двух таблицах : Params и Config.
Из Params они извлекаются запросом
SELECT BinaryData FROM Params WHERE FileName = N’DBNames’
Полученное поле имеет двоичный формат и читается функцией lines. Она принимает аргумент SQLBytes и возвращает в таблицу @db набор строк вида
{49bec45b-a7ee-4cb0-9de5-19440ac12e4b,»CKinds»,1},
{ed0a9c1c-c7eb-47b6-b75b-7a2a1b3d38ce,»Node»,2},
{16e8215b-eadd-4663-aff6-c400a657d768,»Node»,3},
…
В начале строки — ключ 1С типа char(36) (k36) , по которому осуществляется привязка к Config, в конце — индекс sql-наименования столбца или таблицы (num), по которому можно это самое наименование однозначно определить в дальнейшем.
Полученный выше набор ключей 1С (Select k36 from @db)содержит, в том числе, ключи таблиц 1С, которым соответствуют поля [FileName] в Config. Из последнего извлекаются записи с where [FileName] in (Select k36 from @db),
а поля BinaryData распаковываются в наборы строк вышеупомянутой функцией lines.
insert Clines
SELECT [FileName], f.Line [CLine]
FROM [dbo].[Config]
cross apply [Rig].[dbo].[lines] ([BinaryData]) f
where [FileName] in (Select k36 from @db)
Однако далее возникает проблема, связанная с большим объемом данных, полученных при распаковке. В моем варианте он составил около 300 тыс. строк текста, из которого надо извлечь ключи char(36).
Вариант решения связан с полнотекстовым индексированием полученных строк и использованием предиката CONTAIN вида
SELECT * WHERE CONTAINS(c.CLine, @k36) and LEFT(c.CLine, 5)='{0,0,’
Второе условие в WHERE — это просто выделение строк с 1С -именами.
Далее полученная таблица привязывается к представлениям метаданных [INFORMATION_SCHEMA].[TABLES],[INFORMATION_SCHEMA].[COLUMNS]
c помощью индекса num. Он формируется с помощью функции fnGetNum, которая выделяет группу цифр подряд в конце имени таблицы или столбца, например из _Acc6_ExtDim8081 получится 8081.
Остальное в комментариях внутри скриптов.