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