|   |   | 
| 
 | 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) Не. Старым методом загрузки воспользовался. Правлю сейчас схемы.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |