Имя: Пароль:
1C
1C 7.7
v7: Нужна помощь с запросом SQL
0 АЛьФ
 
04.01.22
15:45
Надо загрузить ФИАС в SQL. Нашел по теме готовые скрипты: https://habr.com/ru/post/451720/
Все бы ничего, но там скрипты под SQL Server 2008, а у нас стоит 2005. Конкретно затык в использовании VALUES в Cross apply. Наша версия SQL такого еще не понимает.
Можно это дело как-то переписать? Ну, хотя бы доступным языком указать мне направление?
Первыми комментами дам тексты запросов, которые вызвали проблемы.
1 АЛьФ
 
04.01.22
15:45
;WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema' as xs)
Select a.[table]
  ,tbl.[root_name]
  ,tbl.[root_description]
  ,tbl.[name]
  ,ROW_NUMBER() over (partition by a.[table] order by 1/0) N
  ,tbl.[column]
  ,tbl.[required]
  ,tbl.[description]
  ,tbl.[type]
  ,tbl.[len]
  ,Case tbl.[type]  
        when N'byte' then N'tinyint'
        when N'date' then N'date'
        when N'int'  then N'int'
        when N'string' then
                        Case when tbl.[len] = 36 and (tbl.[column] like N'%ID' or tbl.[column] = N'NORMDOC') then N'uniqueidentifier'
                            when tbl.[len] is Null then N'nvarchar(max)'
                        Else N'nvarchar(' + cast(tbl.[len] as nvarchar(4000)) + N')' END
        when N'integer' then
                        Case when tbl.[len] > 9 then N'bigint'
                             when tbl.[len] <= 4 then N'smallint'
                            Else N'int'
                        end
        else N'nvarchar(max)'
        End [sqltype]
  ,t.n.query('.') [node]
into dbo.[_FIAS]
from dbo.[_FIAS_SCHEMAS] a
    Cross apply a.x.nodes('//xs:attribute') t(n)
    Cross apply
            (values -- некоторые поля используются несколько раз, поэтому сделаем так :)
            (
                 x.value('(xs:schema[1]/xs:element[1]/@name)', 'nvarchar(255)')
                ,x.value('(xs:schema[1]/xs:element[1]/xs:annotation/xs:documentation[1]/text())[1]', 'nvarchar(4000)')
                ,x.value('(xs:schema[1]/xs:element[1]/xs:complexType[1]/xs:sequence[1]/xs:element[1]/@name)', 'nvarchar(255)')
                ,t.n.value('(./@name)[1]', 'nvarchar(255)')
                ,t.n.value('(./@use)[1]', 'nvarchar(255)')
                ,Stuff(Coalesce(t.n.value('(./xs:simpleType/xs:restriction/@base)[1]', 'nvarchar(255)'), t.n.value('(./@type)[1]', 'nvarchar(255)')), 1, 3, '')
                ,Coalesce(t.n.value('(./xs:simpleType/xs:restriction/xs:length/@value)[1]', 'int')
                            ,t.n.value('(./xs:simpleType/xs:restriction/xs:maxLength/@value)[1]', 'int')
                            ,t.n.value('(./xs:simpleType/xs:restriction/xs:totalDigits/@value)[1]', 'int'))
                ,Replace(
                 Replace(
                 Replace(
                 Replace(
                 Replace(
                 Replace(
                 Replace(
                 Replace(
                 Replace(t.n.value('(./xs:annotation/xs:documentation)[1]', 'nvarchar(4000)'), '  ', ' ')
                 , '  ', ' ')
                 , '  ', ' ')
                 , '  ', ' ')
                 , '  ', ' ')
                 , '  ', ' ')
                 , '  ', ' ')
                 , '  ', ' ')
                 , '  ', ' ')
            )
            ) tbl([root_name], [root_description], [name], [column], [required], [type], [len], [description])
2 АЛьФ
 
04.01.22
15:46
Open cur
FETCH NEXT FROM cur into @table, @column

WHILE @@FETCH_STATUS = 0  
BEGIN
update a
Set x.modify('declare namespace ss="urn:schemas-microsoft-com:mapping-schema";            
insert (              
           attribute ss:field {sql:column("t.column")}
           ,attribute ss:datatype {sql:column("b.sqltype")}
        )            
into (//xs:attribute[@name = sql:column("b.column")])[1]')
from dbo.[_FIAS_SCHEMAS] a
      inner join dbo.[_FIAS] b on a.[table] = b.[table]
      cross apply (Values(QUOTENAME(b.[column]))) t([column])
      Where b.[table] = @table and b.[column] = @column

FETCH NEXT FROM cur into @table, @column
END
CLOSE cur;  
DEALLOCATE cur;
3 Ёпрст
 
04.01.22
16:49
(0) оконные функции 2005 не умеет вроде как..роупартишн
4 youalex
 
04.01.22
16:57
Если не хочешь курить эти скриты и они факт работают на 2008 - подними копию базы на 2008 инстансе, выполни этот скрипт,  а потом просто перезалей данные в 2005 (перед этим копию сделать не повредит)
5 АЛьФ
 
04.01.22
17:11
2(3) А?
2(4) К сожалению, не подойдет такое решение.
6 youalex
 
04.01.22
17:18
Вот эта конструкция любопытная
order by 1/0 -- так можно/и зачем  ?
7 АЛьФ
 
04.01.22
17:21
2(6) Для меня тут практически все китайская грамота. Надеялся, что с прошлой моей возни с ФИАСом появились работающие скрипты. А тут вон какая засада. У нас не запускаются.
8 GreyK
 
04.01.22
17:30
(0) Вроде здесь не форум по SQL, да и как я помню вы свои фронты писали с использованием SQL. Зачем в 7ке использовать SQL запросы!?
9 exwill
 
04.01.22
17:36
(6) Видимо, это означает "сортировать по последней колонке"
10 АЛьФ
 
04.01.22
17:36
2(8) Какая прелесть... я так скучал по этому... Прям мимими...
11 youalex
 
04.01.22
17:37
(9) и при этом не валится в исключение? Оригинально
12 youalex
 
04.01.22
17:41
(7) тут основная китайщина в парсинге хмл средствами исключительно скуля. Как вариант можно хмл парсить другими средствами, msxmldom для 77 или ДокументХМЛ для 8.*, а в таблицы заливать уже нативные данные.  но это опять же придется курить изначальную логику. В качестве апа, скорее
13 АЛьФ
 
04.01.22
17:51
2(12) Спасибо. Боюсь, что если делать загрузку сотни гигов средствами 1С, то это все помрет уже на втором десятке.
14 FN
 
04.01.22
18:00
Конвертнуть в csv и загрузить?
Вот сходу нагуглил онлайн-конвертер https://www.aconvert.com/ru/document/xml-to-csv/
15 GreyK
 
04.01.22
18:20
(10) Обычно все ваши мимишные терабайты ужимаются до мегабайтов в 7ке, ну может я и не прав, но подскажите мне каков будет размер базы SQL после загрузки ваших гигабайтов?
16 АЛьФ
 
04.01.22
18:27
2(14) Что конвертнуть? Триста гигов xml?
2(15) Никогда ФИАС не видел? Бывает...
17 Ёпрст
 
05.01.22
10:18
(0) ну шо, переделал запрос?
Зы: быстрее так-то версию скуля поднять, а то щас кучка примеров, которые ужо и в 2008 не работают, приходилось переписывать
18 АЛьФ
 
05.01.22
10:46
2(17) Не. Старым методом загрузки воспользовался. Правлю сейчас схемы.